2012-06-01 6 views
2

Итак, я новичок в django, и я борюсь с документацией для представлений на основе классов. Не совсем уверен, что я делаю неправильно здесь, но в этом проблема:Сохранение данных модели с формы в django

Я заполняю соответствующие данные в форме, нажимаю submit, и я перенаправлен на тот же URL-адрес плюс некоторые параметры get, которые соответствуют тому, что Я представил в форме. Ничего нового не добавлено в db. Я хотел бы создать новую строку Advertisement в db, когда я нажму кнопку «Отправить».

У меня есть ModelForm следующим образом:

class NewAdForm(ModelForm): 
    class Meta: 
      model = Advertisement 
      exclude = ('campaign',) 

    def __init__(self, campaign, *args, **kwargs): 
      super(NewAdForm, self).__init__(*args, **kwargs) 
      self.campaign = campaign 

У меня также есть FormView:

class AddAdvertView(FormView): 
    form_class = NewAdForm 
    template_name = 'advertisers/newad.html' 

    def get_form_kwargs(self):this 
      kwargs = super(AddAdvertView, self).get_form_kwargs() 
      kwargs['campaign'] = get_object_or_404(Campaign, id__exact = self.kwargs['campaign_id']) 
      return kwargs 

    def form_valid(self, form): 
      form.save(commit = True) 
      return super(AddAdvertView, self).form_valid(form) 

А вот шаблон:

<form action="" method="get"> 
{{ form.as_p }} 
<input type="submit" value="Submit"/> 
</form> 

ответ

3

Любая причина, по которой вы используете method="get"? Класс FormView, вероятно, ожидает POST, чтобы инициировать проверку и сохранение. GET обычно используется для визуализации исходной формы.

+0

Спасибо за помощь. Я использовал get, потому что я думал, что это проще. Просто для пояснения: GET отображает шаблон формы, а затем триггеры POST-шаблонов? –

+1

Да, это нормальный шаблон в формах Django. –

0

Вполне возможно, что это потому, что вы» повторно пропустить токен CSRF, но он действительно должен дать вам об этом ошибку. Тем не менее, попробуйте:

<form action="" method="get">{% csrf_token %} 
{{ form.as_p }} 
<input type="submit" value="Submit"/> 
</form> 

Кроме того, в то время как он не объясняет, почему форма не сохраняется, необходимо указать success_url на вашем FormView, то URL пользователь должен быть перенаправлен после успешной отправки формы , Я на самом деле никогда не пытался отказаться от него, но вполне возможно, что представление вернет вас к форме просто потому, что оно не знает, куда еще идти.

+0

Вы не можете оставить 'success_url' без возникновения ошибки, когда форма пытается перенаправить на нее в конце' form_valid() ' – Josh

+0

@Josh: Довольно уверен, что мой ответ явно говорит:« вам нужно указать 'success_url' на' FormView'. –

+0

Вы сказали, что никогда не пробовали. Я сделал. Из моего комментария ничего, кроме сообщения об ошибке, не появилось. – Josh

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