2013-04-19 3 views
0

Я пытаюсь обернуть голову вокруг 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> 
... 

ответ

0

Я думаю, вам следует обратиться к title поле form.cleaned_data['title'], а не form.title. Представленные действительные значения полей находятся в form.cleaned_data dict.

Так изменить код, как

def form_valid(self, form): 
    try: 
     Guide.objects.get(title=form.cleaned_data['title']) 
    except ObjectDoesNotExist: 
     return super(NewGuideView, self).form_valid(form) 
    return super(NewGuideView, self).form_invalid(form) 

form.title Оценивая приведет к AttributeError, который не обрабатывается в методе.

+0

Да, это была моя ошибка - результат позднего ночного кодирования. Однако, исправляя это, я все еще не смог преодолеть свою проблему. Я разместил оператор печати прямо в первой строке моего метода form_valid и ничего не печаталось. Поэтому его даже не называют. –

+0

@ DanielMartin, строка в urls.py 'guide.NewGuideView.as_view()' не кажется подходящей. Я не думаю, что это «руководство». – Rohan

+0

У меня есть свои представления, разделенные на разные модули для целей orginization. Итак, у меня есть папка «views» с определенным __init__.py, который импортирует разные модули просмотра. Я знаю, что это не проблема. Вернемся к моему CBV, NewGuideView, если я поставлю оператор печати внутри метода переопределенной отправки, материал печатается. По какой-то причине form_valid не вызывается. –

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