2009-07-29 13 views
40

में अनुरोध डेटा प्राप्त करें क्या फ़ॉर्म फॉर्म में request.user डेटा प्राप्त करना संभव है? मैं यह सुनिश्चित करने के लिए एक ईमेल पता साफ़ करना चाहता हूं कि यह अद्वितीय है, लेकिन यदि यह वर्तमान उपयोगकर्ता ईमेल पता है तो इसे पास करना चाहिए।Django फॉर्म

यह वही है जो मेरे पास वर्तमान में है जो नए उपयोगकर्ताओं को बनाने के लिए बहुत अच्छा काम करता है, लेकिन यदि मैं किसी उपयोगकर्ता को संपादित करना चाहता हूं तो मैं अपने ईमेल की समस्या में भाग लेना चाहता हूं, क्योंकि यह पहले से ही लिया जा रहा है। अगर मैं जांच सकता हूं कि यह request.user.email का उपयोग कर उनका ईमेल है तो मैं अपनी समस्या का समाधान कर पाऊंगा, लेकिन मुझे यकीन नहीं है कि यह कैसे करें।

class editUserForm(forms.Form): 
    email_address = forms.EmailField(widget=forms.TextInput(attrs={'class':'required'})) 

    def clean_email_address(self): 
     this_email = self.cleaned_data['email_address'] 
     test = UserProfiles.objects.filter(email = this_email) 
     if len(test)>0: 
      raise ValidationError("A user with that email already exists.") 
     else: 
      return this_email 

उत्तर

56

आर्स और Diarmuid के रूप में बताया है, तो आप अपने प्रपत्र में request.user पारित कर सकते हैं, और ईमेल सत्यापित करने में इसका इस्तेमाल करते हैं। Diarmuid का कोड, हालांकि, गलत है। कोड वास्तव में पढ़ना चाहिए:

from django import forms 

class UserForm(forms.Form): 
    email_address = forms.EmailField(widget = forms.TextInput(attrs = {'class':'required'})) 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user', None) 
     super(UserForm, self).__init__(*args, **kwargs) 

    def clean_email_address(self): 
     email = self.cleaned_data.get('email_address') 
     if self.user and self.user.email == email: 
      return email 
     if UserProfile.objects.filter(email=email).count(): 
      raise forms.ValidationError(u'That email address already exists.') 
     return email 

फिर, अपने दृश्य में, आप यह बहुत की तरह उपयोग कर सकते हैं:

def someview(request): 
    if request.method == 'POST': 
     form = UserForm(request.POST, user=request.user) 
     if form.is_valid(): 
      # Do something with the data 
      pass 
    else: 
     form = UserForm(user=request.user) 
    # Rest of your view follows 

ध्यान दें कि यदि आप एक कीवर्ड तर्क के रूप में request.POST पास करना चाहिए अपने निर्माता के बाद से 'उपयोगकर्ता' को पहली स्थितित्मक तर्क के रूप में उम्मीद करता है।

इसे इस तरह से करने के लिए, आपको user को कीवर्ड तर्क के रूप में पास करने की आवश्यकता है। आप या तो request.POST को एक स्थितित्मक तर्क के रूप में या एक कीवर्ड तर्क (data=request.POST के माध्यम से) पास कर सकते हैं।

+3

कोड इस उदाहरण में मेरे उत्तर में बेहतर है, इसलिए मैंने इसे हटा दिया और इसे हटा दिया, हालांकि आप clean_email_address विधि में अगर खंड में == के बजाय == चाहते हैं। – Prairiedogg

+0

फिक्स्ड। इसे पकड़ने के लिए धन्यवाद :) – elo80ka

+2

> ध्यान दें कि आपको अनुरोध पास करना चाहिए। एक कीवर्ड तर्क के रूप में पोस्ट करें, क्योंकि आपका कन्स्ट्रक्टर 'उपयोगकर्ता' को पहले स्थानगत तर्क के रूप में अपेक्षा करता है। यह विशेष रूप से आपको ** शब्द के साथ कुंजी-शब्द (यानी, वैकल्पिक) तर्कों को मिश्रण नहीं करना चाहिए। इसके बजाए, निर्माता के पास उपयोगकर्ता नहीं होना चाहिए और इसे केवल पहली पंक्ति के रूप में रखना चाहिए: उपयोगकर्ता = kwargs.pop ('user') अगर 'उपयोगकर्ता' kwargs में कोई अन्य नहीं – jorelli

0

ऐसा नहीं है कि मुझे पता है। इसे संभालने का एक तरीका है आपकी फॉर्म क्लास __init__ एक वैकल्पिक ईमेल पैरामीटर लें, जिसे वह एक विशेषता के रूप में स्टोर कर सकता है। यदि प्रपत्र निर्माण के समय में आपूर्ति की, इसका इस्तेमाल कर सकते हैं कि तुलना में आपकी रुचि है के लिए सत्यापन के दौरान।

3

बस इतना ही पता है कि Django 1.4 और जेनेरिक क्लास आधारित CreateView और UpdateView के साथ, प्रत्येक मॉडल फ़ॉर्म पर एक self.instance पॉप्युलेट किया जाता है, जो आपको वर्तमान उपयोगकर्ता ईमेल बनाम पोस्ट किए गए ईमेल की तुलना करने की अनुमति देता है।

यहाँ, एक कोड नमूना है mixin

class EmailUniqueMixin(object): 
    """ 
    Ensure each User's email is unique 
    on the form level 
    """ 
    def clean_email(self): 
     email = self.cleaned_data['email'] 
     existing_email = User.objects.filter(email=email).exclude(pk=self.instance.id) 
     if existing_email: 
      raise forms.ValidationError('That email address already exists') 
     else: 
      return email 
24

यहाँ जिस तरह से उपयोग करते समय सामान्य विचारों का उपयोग कर अपने फार्म में उपयोगकर्ता प्राप्त करने के लिए है:

ध्यान में रखते हुए प्रपत्र get_form_kwargs का उपयोग करने के request.user पारित :

class SampleView(View): 
    def get_form_kwargs(self): 
     kwargs = super(SampleView, self).get_form_kwargs() 
     kwargs['user'] = self.request.user 
     return kwargs 

फॉर्म में आप __init__ समारोह के साथ user प्राप्त होगा:

class SampleForm(Form): 
    def __init__(self, user, *args, **kwargs): 
     super(SampleForm, self).__init__(*args, **kwargs) 
     self.user = user 
+2

यह बेहतर है http://stackoverflow.com/a/6062628/758202 – zzart

+0

मैं वास्तव में इस तरह से पसंद करता हूं, लेकिन आपको कन्स्ट्रक्टर को कॉल करने से पहले उपयोगकर्ता को kwargs से हटा देना चाहिए .. कुछ 'self.user = kwargs.pop (' user ') ' – intelis

संबंधित मुद्दे