2015-05-01 2 views
0

Я пытаюсь создать простую форму для редактирования профиля для пользователей на веб-сайте. Я следил за стандартным советом по обновлению, в документах говорится, что Django обнаруживает первичный ключ экземпляров и знает обновлять вместо вставки.Django: обновление моделей, новый экземпляр, созданный вместо обновленного

только проблема есть, я получаю вставку, когда пытаюсь обновить. Я предварительно заполнил форму экземпляром модели (экземпляр, который я пытаюсь редактировать), но когда я попытаюсь сохранить его, я получаю новый экземпляр. Когда я добавляю строку «force_update = True», я получаю сообщение об ошибке, которое сообщает мне, что первичный ключ не обнаружен. Не уверен, почему, поскольку im pre заполняет форму экземпляром модели, хотя, очевидно, pk не является частью формы. есть что-то им не хватает?

некоторый код:

модель:

class profile(models.Model): 
    user = models.ForeignKey(User) 
    first_name = models.CharField(max_length=20, null=True) 
    last_name = models.CharField(max_length=20, null=True) 
    DOB = models.DateField(null=True) 
    age = models.IntegerField(null=True) 
    public_email = models.EmailField(null=True) 
    county = models.CharField(max_length=20, null=True) 
    town = models.CharField(max_length=30, null=True) 

форма:

class profileForm(forms.ModelForm): 
    class Meta: 
     model = profile 
     exclude = ['user'] 

вид:

@login_required() 
def edit_profile(request): 
    if request.POST: 
     proform = profileForm(request.POST) 
     if proform.is_valid(): 
      prof = proform.save(False) 
      prof.user = request.user 
      prof.save(force_update=True) 

     return HttpResponseRedirect('/accounts/view_profile/') 
    else: 
     c = {} 
     if profile.objects.filter(user=request.user).exists(): 
      prof = profile.objects.get(user=request.user) 
      c['proform'] = profileForm(instance=prof) 
     else: 
      c['proform'] = profileForm() 

     return render(request, 'edit_profile.html', c) 

любая помощь очень ценится!

ответ

0

Я получил его, оказывается, я пытался просто вызвать save() в форме, не указав конкретный экземпляр, к которому относится форма.

код:

@login_required() 
def edit_profile(request): 
    c = {} 
    if profile.objects.filter(user=request.user).exists(): 
     profModel = profile.objects.get(user=request.user) 
     c['proform'] = profileForm(instance=profModel) 
    else: 
     c['proform'] = profileForm() 

    if request.POST: 
     # this line here, added 'instance=profModel' to specify 
     # the actual instance i want to save 
     proform = profileForm(request.POST, instance=profModel) 
     if proform.is_valid(): 
      prof = proform.save(False) 
      prof.user = request.user 
      prof.save() 

     return HttpResponseRedirect('/accounts/view_profile/') 
    else: 

     return render(request, 'edit_profile.html', c) 

работает!

Смежные вопросы