एक क्लाइंट को प्रबंधकों के लिए एक कंपनी में उपयोगकर्ताओं को जोड़ने की क्षमता की आवश्यकता होती है (यादृच्छिक एक बार पासवर्ड के साथ) जहां उपयोगकर्ता को कुछ भी एक्सेस करने से पहले अपना पासवर्ड बदलना होगा। मैं Django 2.2 में ऐप विकसित कर रहा हूं

मैंने एक कस्टम उपयोगकर्ता बनाया, उपयोगकर्ता नाम को ईमेल पते से बदल दिया और मैंने उपयोगकर्ता को change_password bool ध्वज जोड़ा। मेरा चेंज_पासवर्ड फॉर्म/फ़ंक्शन ठीक से काम करता है, लेकिन रीडायरेक्टिंग नहीं करता है।

Urls.py

path('change-password/', views.change_password, name='change-password'),

View.py

class Login(LoginView):
    def form_valid(self, form):
        # form is valid (= correct password), now check if user requires to set own password
        if form.get_user().change_password:
            return HttpResponseRedirect(reverse('change-password'))
        else:
            auth_login(self.request, form.get_user())
            return HttpResponseRedirect(self.get_success_url())


def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)

        if form.is_valid():
            form.save()
            request.user.change_password = False
            request.user.save()
            update_session_auth_hash(request, request.user)
            return redirect(reverse('user_view'))
        else:
            return redirect(reverse('change-password'))
    else:
        form = PasswordChangeForm(user=request.user)

        args = {'form': form}
        return render(request, 'users/change_password.html', args)

अपेक्षित व्यवहार परिवर्तन-पासवर्ड पर पुनर्निर्देशित करना है यदि परिवर्तन_पासवर्ड ध्वज सत्य है, हालांकि, जबकि ऐप परिवर्तन-पासवर्ड पर पुनर्निर्देशित करता है, सबमिशन पर निम्नलिखित त्रुटि फेंक दी जाती है:

NotImplementedError: Django AnonymousUser के लिए डीबी प्रतिनिधित्व प्रदान नहीं करता है।

यदि मैं अपने चेंज_पासवर्ड फ़ंक्शन में डेकोरेटर @login_required जोड़ता हूं, तो यह त्रुटि दूर हो जाती है, हालांकि, मुझे URL के साथ लॉगिन पृष्ठ पर वापस भेज दिया जाता है: उपयोगकर्ता/लॉगिन/? अगला =/उपयोगकर्ता/परिवर्तन-पासवर्ड/

0
user1314147 2 जुलाई 2019, 17:48

1 उत्तर

सबसे बढ़िया उत्तर

समस्या यह है कि form_valid विधि में आप form.get_user() को कॉल कर रहे हैं जो उपयोगकर्ता को प्रमाणित/प्राप्त करता है और change_password के लिए सही ढंग से जांच करता है, लेकिन यह उपयोगकर्ता को लॉग इन नहीं करता है, जिसका अर्थ है कि उपयोगकर्ता बना रहा है अनुरोध अभी भी सिस्टम के लिए गुमनाम है। इसलिए जब उपयोगकर्ता पुनर्निर्देशित हो जाता है तो वे प्रमाणित नहीं होते हैं, जिसका अर्थ है कि request.user ऑब्जेक्ट AnonymousUser प्रकार के हैं जो डेटाबेस में नहीं रहते हैं इसलिए Django के लिए DB प्रतिनिधित्व प्रदान नहीं करता है बेनामी उपयोगकर्ता त्रुटि।

और जब आप @login_required डेकोरेटर का उपयोग करते हैं तो उपयोगकर्ता लॉगिन पृष्ठ पर पुनर्निर्देशित हो जाता है क्योंकि यह लॉग इन उपयोगकर्ता नहीं है और डेकोरेटर को यह देखने के लिए उपयोगकर्ता को लॉग इन करने की आवश्यकता होती है कि वह सजा रहा है।

आप जो URL देखते हैं users/login/?next=/users/change-password/ मूल रूप से login_required डेकोरेटर कैसे काम करता है और यह दो काम कर रहा है: 1. अनाम उपयोगकर्ता को लॉगिन पृष्ठ पर पुनर्निर्देशित करें (users/login URL का भाग) 2. एक बार जब वे सफलतापूर्वक लॉग इन कर लेते हैं तो उन्हें वापस वहीं से रीडायरेक्ट कर देते हैं जहां से वे आए थे (?next=/users/change-password/)

मेरा सुझाव है कि आप उस उपयोगकर्ता का उपयोगकर्ता नाम पास करें जिसने लॉग इन करने का प्रयास किया था, लेकिन उसे अपना पासवर्ड change_password दृश्य में बदलना होगा और वहां उपयोगकर्ता की प्रतीक्षा में एक फॉर्म होगा जो वर्तमान पासवर्ड के लिए पूछता है, नया और एक नए पासवर्ड की पुष्टि। आप जो करना चाहते हैं उसे करने का यह सबसे आसान तरीका है, लेकिन आपको यह पुष्टि करनी होगी कि उपयोगकर्ता का वर्तमान पासवर्ड फिर से सही है।

भ्रमित करने वाले पहले उत्तर के लिए खेद है, मैंने पहली बार सही प्रश्न नहीं पढ़ा, उम्मीद है कि यह अधिक समझ में आता है :)

1
Vedran 2 जुलाई 2019, 19:37