Django

2013-11-15 4 views
9

में उपयोगकर्ता नाम मौजूद है या नहीं, मैं Django प्रोजेक्ट पर काम कर रहा हूं, जहां उपयोगकर्ता अपने उपयोगकर्ता नाम को अपने पहले और अंतिम नाम के साथ एक रूप में बदल सकेंगे। Form.py में, मैं यह पता लगाने की कोशिश कर रहा हूं कि उपयोगकर्ता मौजूद है या नहीं। यदि ऐसा है, तो यह एक त्रुटि प्रदर्शित करना चाहिए। समस्या यह है कि यदि उपयोगकर्ता अपना पहला और अंतिम नाम बदलना चाहता है और इनपुट में अपना उपयोगकर्ता नाम छोड़ देता है, तो यह एक सत्यापन त्रुटि उठाता है। जाहिर है, वह उपयोगकर्ता नाम पहले से मौजूद है। क्या यह जांचने का कोई तरीका है कि क्या यह वर्तमान में लॉग इन उपयोगकर्ता के उपयोगकर्ता नाम के बराबर है और त्रुटि प्रदर्शित करने से बचें?Django

class ChangeNameForm(forms.ModelForm): 
    username = forms.CharField(max_length=30) 
    first_name = forms.CharField(max_length=255) 
    last_name = forms.CharField(max_length=255) 

    def clean_username(self): 
     username = self.cleaned_data['username'] 

     try: 
      user = User.objects.get(username=username) 
     except user.DoesNotExist: 
      return username 
     raise forms.ValidationError(u'Username "%s" is already in use.' % username) 

धन्यवाद।

forms.py

from django.contrib.auth.forms import UserChangeForm 
from django.contrib.auth.models import User 

class MyUserChangeForm(UserChangeForm): 
    def __init__(self, *args, **kwargs): 
     super(MyUserChangeForm, self).__init__(*args, **kwargs) 
     del self.fields['password'] 

    class Meta: 
     model = User 
     fields = ('username', 'first_name') 

views.py

def home(request): 
    if request.method == 'POST': 
     form = MyUserChangeForm(request.POST, instance=request.user) 
     if form.is_valid(): 
      form.save() 
    else: 
     form = MyUserChangeForm(instance=request.user) 

    return render(request, 'change_user.html', {"form": form}) 

उत्तर

22

जब ModelForms हैं:

+0

धन्यवाद आदमी, यह वही है जो मैं ढूंढ रहा हूं। – lukas

+0

हेय्या @ लुकास भी 'user.objects.filter (उपयोगकर्ता नाम = उपयोगकर्ता नाम) कर सकते हैं .count() ' – wonderwhy

0

यह कैसे मैं यह काम (यह मानते हुए आप एक उपयोगकर्ता में लॉग इन किया है) बनाने में कामयाब रहे है एक मॉडल ऑब्जेक्ट से बंधे, उनके पास 'इंस्टेंस' नामक एक विशेषता है, जो मॉडल ऑब्जेक्ट है। आपके विचार में, जब request.method == 'POST', तो आप शायद प्रपत्र उदाहरण इस तरह बना रहे हैं:

form = ChangeNameForm(request.POST, instance=request.user) 

अगर ऐसी बात है, तो आप प्रपत्र तरीकों से लॉग ऑन उपयोगकर्ता का उपयोग कर सकते हैं, और अपने सत्यापन विधि कुछ इस तरह हो सकता है :

def clean_username(self): 
    username = self.cleaned_data['username'] 
    try: 
     user = User.objects.exclude(pk=self.instance.pk).get(username=username) 
    except User.DoesNotExist: 
     return username 
    raise forms.ValidationError(u'Username "%s" is already in use.' % username) 

, यदि आप .get विधि के साथ सभी उपयोगकर्ता जानकारी प्राप्त करने का प्रयास की तुलना में अपने डेटाबेस के लिए एक तेजी से प्रश्न जारी के लिए .exists विधि का उपयोग पर विचार करें। और कोड एक छोटे से क्लीनर भी हो जाता है:

def clean_username(self): 
    username = self.cleaned_data['username'] 
    if User.objects.exclude(pk=self.instance.pk).filter(username=username).exists(): 
     raise forms.ValidationError(u'Username "%s" is already in use.' % username) 
    return username 

वैकल्पिक रूप से, आप भी अनुसरण कर सकते हैं these guidelines जब ValidationError उठा।

मैं अभी इस कोड का परीक्षण नहीं कर सकता, इसलिए अगर कुछ भी गलत है तो मैं क्षमा चाहता हूं।