2014-10-30 10 views
11

जब मैं एक UserProfile मॉडल के लिए जानकारी जोड़ने के लिए एक प्रोफ़ाइल को संपादित करने कोशिश कर रहा हूँ, मैं इस अजीब त्रुटि हो रही है:Django: अखंडता त्रुटि अद्वितीय बाधा विफल रहा: user_profile.user_id

IntegrityError at /profiles/edit/ 
UNIQUE constraint failed: user_profile.user_id 

यहाँ क्या गलत है,

मॉडल:

class UserProfile(models.Model): 

    user = models.OneToOneField(User) 
    bio = models.TextField(blank=True) 
    phone= models.CharField(max_length=10, blank=True) 
    address = models.CharField(max_length=1024) 
    age = models.PositiveIntegerField(blank=True,null=True) 
    gender = models.IntegerField(choices=GENDER_CHOICES, default=1) 

प्रपत्र:

class UserProfileForm(forms.ModelForm): 

    class Meta: 
     model = UserProfile 
     fields = ('phone','age','gender','address','bio') 

दृश्य:

def edit_profile(request): 

    if request.method == 'POST': 
     form = UserProfileForm(request.POST) 
     print request.POST 
     if form.is_valid(): 

      new_profile = UserProfile(
          user = request.user, 
          bio = request.POST['bio'], 
          address = request.POST['address'], 
          age = request.POST['age'] 
          ) 

      new_profile.save() 

      return HttpResponseRedirect(reverse('user_public_profile', args=(request.user.username,))) 
     return render(request,'users/edit_profile.html', {'form': form}) 

    else: 
     form = UserProfileForm() 
     return render(request,'users/edit_profile.html', 
          {'form': form}) 
+0

आपकी समस्या के लिए विशिष्ट नहीं है, लेकिन मैं एक ही त्रुटि जब मैं गलती से एक 'ModelForm.save वस्तु क्षेत्रों में फेरबदल किया गया था (प्रतिबद्ध = झूठी)' भर में भाग गया, या कम से कम यह मैं 'प्रतिबद्ध' को संभालने के तरीके से संबंधित था। – jozxyqk

उत्तर

12

यह अजीब नहीं है। आपके पास उस उपयोगकर्ता के लिए पहले से ही एक प्रोफ़ाइल है, इसलिए एक और जोड़ना अद्वितीय बाधा को तोड़ देता है। आपको मौजूदा एक को संपादित करने की आवश्यकता है, न कि नया जोड़ें।

यह भी ध्यान रखें कि जब आप सहेजते हैं तो आप साफ फॉर्म डेटा का उपयोग नहीं कर रहे हैं, जो आपको होना चाहिए। या तो form.cleaned_data['bio'] आदि का उपयोग करें, या यहां तक ​​कि बेहतर form.save() करें जो मॉडल फॉर्म का उपयोग करने का पूरा बिंदु है।

है कि एक साथ लाना:

try: 
    profile = request.user.userprofile 
except UserProfile.DoesNotExist: 
    profile = UserProfile(user=request.user) 

if request.method == 'POST': 
    form = UserProfileForm(request.POST, instance=profile) 
    if form.is_valid(): 
     form.save() 
     return redirect... 
else: 
    form = UserProfileForm(instance=profile) 
return render... 
संबंधित मुद्दे