2012-03-31 16 views
7

के बाद खोल में ठीक काम करता है:उपयोगकर्ता ऑब्जेक्ट को नया बनाये बिना अपडेट कैसे करें?

>>> from django.contrib.auth.models import User 
>>> user=User.objects.get(pk=1) 
>>> user.first_name = u'Some' 
>>> user.last_name = u'Name' 
>>> user.save() 
>>> user.first_name 
u'Some' 
>>> user.last_name 
u'Name' 

तब मैं रूपों के साथ भी ऐसा ही करने की कोशिश:

# forms.py 
class UserForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ['first_name', 'last_name'] 


# views.py 
def edit_names(request, template_name="registration/edit_names.html"): 
    if request.method == "POST": 
     form = UserForm(data=request.POST) 
     if form.is_valid(): 
      user = form.save(commit=False) 
      user.save() 
      url = urlresolvers.reverse('my_account') 
      return HttpResponseRedirect(url) 
    else: 
     form = UserForm(instance=request.user) 
    page_title = _('Edit user names') 
    return render_to_response(template_name, locals(), 
     context_instance=RequestContext(request)) 

# edit_names.html 
<form action="." method="post">{% csrf_token %} 
    <table> 
     {{ form.as_table }} 
     <tr><td colspan="2"> 
      <input type="submit" /> 
     </td></tr> 
    </table> 
</form> 

मैं ब्राउज़र में पेज खोल सकते हैं और दो क्षेत्रों First name और Last name देखते हैं।

Exception Type: IntegrityError 
Exception Value: column username is not unique 

मैं भी UserForm में क्षेत्रों की सूची पर ['username'] जोड़ने की कोशिश की: जब मैं क्षेत्रों में भरें और फ़ॉर्म सबमिट मैं त्रुटि मिलती है। अगर मैं अपने उपयोगकर्ता नाम (request.user के रूप में) के साथ फ़ॉर्म सबमिट करेंगे, प्रपत्र प्रदर्शित करता है ERRORMESSAGE:

User with this Username already exists. 

अगर मैं कुछ अनूठा नाम करने के लिए उपयोगकर्ता नाम बदलकर कि उपयोगकर्ता नाम के साथ नया प्रयोक्ता बनाया जा रहा है।

प्रश्न यह है: मैं उपयोगकर्ता ऑब्जेक्ट को कैसे अपडेट कर सकता हूं, नया नहीं बना सकता?

इतने वर्बोज़ होने के लिए खेद है, लेकिन मुझे यहां मुश्किल खोज थी और मेरे प्रश्न का उत्तर नहीं मिला।

Btw, इन मामलों मेरे लिए काम नहीं है:

संपादित करें:

@fceruti मैं सिर्फ सुझाव दिया req पर जोड़ा गया uest.method == 'पोस्ट' शाखा इस:

form = UserForm(data=request.POST, instance=request.user) 

उत्तर

19

बस == 'पोस्ट' शाखा request.method पर जोड़ने के इस:

form = UserForm(data=request.POST, instance=request.user) 
+0

वहाँ नहीं एक 'अनुरोध किया जाएगा। उपयोगकर्ता' अगर यह एक साइन अप फॉर्म –

+1

है लेकिन यह एक संपादन उपयोगकर्ता का रूप है: पी – fceruti

+0

आह क्षमा करें, मैंने दृश्य नाम –

3
if request.method == "POST": 
    kwargs = { 'data' : request.POST } 
    try: 
     kwargs['instance'] = User.objects.get(username=request.POST['username']) 
    except: 
     pass 
    form = UserForm(kwargs**) 
    if form.is_valid(): 
     user = form.save(commit=False) 
     ... 
+1

के रूप में उत्तर यह संस्करण भी काम करता है, आपकी मदद के लिए धन्यवाद! एक पल के अलावा: मुझे लगता है कि डबल तारांकन को'फॉर्म = उपयोगकर्ताफॉर्म (** kwargs) ' –

+0

से पहले जाना चाहिए इस प्रकार एक अतिरिक्त डीबी लुकअप का कारण बन जाएगा @ fceruti समाधान इस स्थिति में बहुत बेहतर है। हालांकि इस तरह के अन्य उदाहरणों के बारे में जानना उपयोगी है –

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