2016-12-10 6 views
0

Я новичок в программировании Django и Python, и сейчас я очень много борюсь :(!! Я создал форму обновления/редактирования с помощью модели Django формы, но он просто не заполняет поля формы и не отправляет их в базу данных одновременно.Как заполнить форму обновления Django и записать ее обратно в базу данных

Я думаю, что проблема здесь: «form = AdvertisingForm (request.POST или None, request.FILES или None , экземпляр = форма)»

Без "request.POST или None, request.FILES или None", это не предварительно заполнить поля, но не обновляет базу данных ...

Это мой views.py:

def update_advert(request, id): 
if not request.user.is_authenticated(): 
    return render(request, 'forum/login.html') 
else: 
    form = get_object_or_404(Advert, pk=id) 
    if request.method == 'POST': 
     form = AdvertForm(request.POST or None, request.FILES or None, instance=form) 
     if form.is_valid(): 
      form = form.save(commit=False) 
      form.user = request.user 
      form.save() 
      return redirect('forum:user_account') 
    else: 
     form = AdvertForm(instance=form) 


    context = {'form': form} 
    return render(request, 'forum/update_advert.html', context) 

В настоящее время он выглядит так, когда я пытаюсь открыть форму обновления:

opening the form --> not prepopulated :(

ответ

0

Согласно https://docs.djangoproject.com/en/dev/ref/forms/api/#dynamic-initial-values, вы можете использовать атрибут initial при создании форм для того, чтобы препроводить ваши формы.

def update_advert(request, id): 
    if not request.user.is_authenticated(): 
     return render(request, 'forum/login.html') 
    else: 
     advert_obj = get_object_or_404(Advert, pk=id) 


     if request.method == 'POST': 
      form = AdvertForm(request.POST or None, request.FILES or None, instance=advert_obj) 
      if form.is_valid(): 
       form.save() 
       return redirect('forum:user_account') 
     else: 
      # Prepopulation happens here: 
      data = {"some_field": advert_obj.some_val} # Insert all the values of advert_obj here and their field names as keys. 
      form = AdvertForm(initial=data) 


     context = {'form': form} 
     return render(request, 'forum/update_advert.html', context) 

В вашем AdvertForm, поместите этот код:

class AdvertForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(AdvertForm, self).__init__(*args, **kwargs) 

    def save(self, commit=True): 
     instance = super(AdvertForm, self).save(commit=False) 
     instance.user = self.request.user 

     if commit: 
      instance.save() 
     return instance 

Первостепенной save метод просто делает то, что вы делали в воззрениях связать вверх request.user к примеру, однако я поместил этот код в классе формы, чтобы сохранить ваш views простым.

Кроме того, я вижу одну запутанную (но не жизненно важную) проблему - вы перепутали имена переменных. При вызове form = get_object_or_404(Advert, pk=id) это должно возвращаться к имени переменной, например advert или что-то подобное. Не form, поскольку это может сбивать с толку, поскольку мы возвращаем объект модели не в форму. Аналогично, form.save(commit=False) возвращает «экземпляр», а не модель. Это не решит вашу проблему, но должно быть указано, что нужно уточнить, что именно возвращается, и как вы должны тогда назвать свои переменные.

+0

Спасибо. Это действительно помогло мне лучше понять мой код! Но он по-прежнему не показывает предварительно заполненные поля с ** «request.POST или None, request.FILES или None» ** ... Когда у меня просто это выглядит так: ** «form = AdvertisingForm (instance = advert_obj) "** он покажет мне предварительно заполненные поля, но не запишет их обратно в базу данных ... – 2cool4school

+0

Не могли бы вы объяснить, что вы подразумеваете под« шоу »? Код, 'form = AdvertisingForm (request.POST или None, request.FILES или None, instance = advert_obj)', который запускается, когда вы делаете запрос 'POST', должен ОБНОВЛЯТЬ текущую' advert_obj'. Он не будет показывать эти поля снова, потому что вы перенаправляетесь на 'forum: user_account'. –

+0

Предложение 'else' (когда вы делаете запрос' GET'), будет иметь данные, предварительно заполненные в поля формы, как вы упомянули. Это работает правильно. НО эта часть не должна вообще сохраняться в базе данных, потому что мы просто извлекаем данные. Запрос 'POST' отвечает за сохранение (в вашем случае, обновление текущего' advert_obj') –