【问题标题】:Django 1.5 - CreateView Not Creating / Saving New ModelDjango 1.5 - CreateView 不创建/保存新模型
【发布时间】:2013-04-12 08:59:45
【问题描述】:

我正试图围绕 CBV。在这里,我使用 CreateView 为我的模板提供一个用于创建新模型的表单(通过 POST)。当我为表单提供有效数据时,它会提交并返回到同一页面,就好像表单有错误一样,但事实并非如此。 HTTP POST 后页面刷新时不会显示错误。我知道验证有效,因为我已经测试了在适当的表单字段中没有提供一些数据的场景,并且有与之关联的错误消息。我检查了数据库,没有插入任何记录。我的数据库配置正确。我有应用程序的其他部分从中读取。该数据库还通过 South 应用了所有当前迁移。

我希望有人能对 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'),

guides/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>
...

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    我认为您应该将title 字段称为form.cleaned_data['title'] 而不是form.title。提交的有效字段值在form.cleaned_datadict中。

    所以把你的代码改成

    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 不在您的方法中处理。

    【讨论】:

    • 是的,这是我的一个错误 - 深夜编码的结果。但是,在更正之后,我仍然无法解决我的问题。我在 form_valid 方法的开头行放置了一个打印语句,但没有打印任何内容。所以它甚至没有被调用。
    • @DanielMartin,在 urls.py guide.NewGuideView.as_view() 中的行似乎不合适。我认为它不需要guide.
    • 出于组织目的,我将我的观点分成不同的模块。所以,我有一个定义了 init.py 的“views”文件夹,它导入不同的视图模块。我知道这不是问题。回到我的 CBV,NewGuideView,如果我在重写的调度方法中放置一个打印语句,就会打印一些东西。无论出于何种原因,form_valid 都没有被调用。
    • 我正在尝试使用 Django 1.5.1 做完全相同的事情(除了拆分视图),但我无法调用 form_valid..
    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2016-10-03
    相关资源
    最近更新 更多