Я пытаюсь обернуть голову вокруг CBV. Здесь я использую CreateView для предоставления шаблону формы для создания новых моделей (через POST). Когда я предоставляю форму с действительными данными, она отправляет и возвращает обратно на ту же страницу, как если бы у формы были ошибки, но это не так. Ошибки не отображаются, когда страница обновляется после HTTP POST. Я знаю, что проверка работает, потому что у меня есть тестовые сценарии, где я не предоставляю некоторые данные в соответствующем поле формы, с сообщением об ошибке, связанным с ним. Я проверяю базу данных, и запись не была вставлена. Моя база данных настроена правильно. У меня есть другие части приложения, читающие его. База данных также имеет все текущие миграции, применяемые к ней через Юг.Django 1.5 - CreateView не создает/сохраняет новую модель
Я надеюсь, что кто-то может пролить свет на то, что кажется простой базовой установкой CBV.
Заранее спасибо.
models.py
class Guide(models.Model):
DIFFICULTY_OPTIONS = (
(u'1', u'Easy'),
(u'2', u'So so'),
(u'3', u'Moderate'),
(u'4', u'Challenging'),
(u'5', u'Very challenging'),
)
title = models.CharField(max_length=100, db_index=True)
slug = models.SlugField(max_length=100)
description = models.CharField(max_length=500)
user = models.ForeignKey(User)
difficulty = models.CharField(max_length=1, choices=DIFFICULTY_OPTIONS, default=u'1', null=True, blank=True)
created = models.DateTimeField(default=datetime.datetime.now(), editable=False)
modified = models.DateTimeField(default=datetime.datetime.now())
publish = models.BooleanField(default=False)
delete = models.BooleanField(default=False)
forms.py
class NewGuideForm(forms.ModelForm):
title = forms.CharField(widget=forms.widgets.TextInput(attrs={'placeholder': 'Title',
'class': 'input-block-level'}))
description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': 'Description',
'rows': 8,
'class': 'input-block-level'}))
class Meta:
model = Guide
exclude = ('user', 'slug', 'created', 'modified', 'publish', 'delete', 'modified',)
views.py
class NewGuideView(CreateView):
model = Guide
form_class = NewGuideForm
template_name = "guides/guide_new.html"
success_url = "/" # Just to keep things simple, redirect to root.
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(NewGuideView, self).dispatch(*args, **kwargs)
def form_valid(self, form):
try:
Guide.objects.get(title=form.title)
except ObjectDoesNotExist:
return super(NewGuideView, self).form_valid(form)
return super(NewGuideView, self).form_invalid(form)
urls.py
url(r'^guides/new/$', guide.NewGuideView.as_view(), name='guide-new'),
направляющие/guide_new.html
...
<form method="post">{% csrf_token %}
{{ form.non_field_errors }}
<p>First, let's start by entering a title.</p>
<p>{{ form.title.errors }}</p>
<p>{{ form.title }}</p>
<p>Now, provide a short summary of the problem you will be solving.</p>
<p>{{ form.description.errors }}</p>
<p>{{ form.description }}</p>
<p>On a scale of 1 to 5, 5 being the most difficult, how hard is this?</p>
<p>{{ form.difficulty.errors }}</p>
<p>{{ form.difficulty }}</p>
<button type="submit" class="btn-password btn btn-send">Submit</button>
</form>
...
Да, это была моя ошибка - результат позднего ночного кодирования. Однако, исправляя это, я все еще не смог преодолеть свою проблему. Я разместил оператор печати прямо в первой строке моего метода form_valid и ничего не печаталось. Поэтому его даже не называют. –
@ DanielMartin, строка в urls.py 'guide.NewGuideView.as_view()' не кажется подходящей. Я не думаю, что это «руководство». – Rohan
У меня есть свои представления, разделенные на разные модули для целей orginization. Итак, у меня есть папка «views» с определенным __init__.py, который импортирует разные модули просмотра. Я знаю, что это не проблема. Вернемся к моему CBV, NewGuideView, если я поставлю оператор печати внутри метода переопределенной отправки, материал печатается. По какой-то причине form_valid не вызывается. –