Django:在模型上提供url或定义get_absolute_url方法

时间:2014-06-17 19:22:56

标签: django

每当我提交表单时,数据都会添加到数据库中,但我收到错误

ImproperlyConfigured at /issue/new/
No URL to redirect to.  Either provide a url or define a get_absolute_url method on the Model.

即使我的模型中已经有get_absolute_url

编辑:以上是表格有效时,表格无效时,我

TemplateResponseMixin requires either a definition of 'template_name' or an implementation of 'get_template_names()'

模型:

class Issue(models.Model):
    CATEGORIES = (
        ('A', 'Asd'),
        ('B', 'Bd'),
        ('C', 'Cu'),
        ('D', 'Cr'),
    )
    title = models.CharField(max_length=140)
    description = models.TextField()
    author = models.ForeignKey(User)
    category = models.CharField(max_length=1,
        choices=CATEGORIES)
    date_created = models.DateTimeField(auto_now_add=True)

    def get_absolute_url(self):
        return reverse('issue_detail', kwargs={'pk': self.pk})

    def __unicode__(self):
        return self.title

形式:

class IssueForm(forms.ModelForm):
    class Meta:
        model = Issue
        fields = ('title','description', 'category',)

视图

class IssueCreateView(CreateView):
    form_class = IssueForm

    def form_valid(self,form):
        obj = form.save(commit=False)
        obj.author = self.request.user
        obj.save()
        return HttpResponseRedirect(self.get_success_url())

URL

url(r'^new/', IssueCreateView.as_view(), name='issue_create'),

模板

<form action="/issue/new/" method="post">
    {% csrf_token %}
    {{ issueform.as_p }}

  </form>

2 个答案:

答案 0 :(得分:2)

您重写的

ModelFormMixin.form_validself.object设置为新创建的对象,然后由get_success_url使用。在self.object = obj中尝试form_validget_success_url再次有效。

答案 1 :(得分:2)

sk1p关于你的第一个问题是正确的,尽管我会使用super()并以更简洁的方式编写它:

class IssueCreateView(CreateView):
    form_class = IssueForm

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(IssueCreateView, self).form_valid(form)

使用super通常会消除覆盖方法的所有问题,允许您自定义行为,而无需重新实现重写方法的逻辑。

关于你的第二个问题:

通常,表单会发布到自己的网址,或者如果有错误,则至少提供一个基本页面。如果第一次提交中有任何错误,您可以添加一个显示表单及其所有错误的基本模板。

如果要重定向回原始表单页面,您将丢失重定向上的POST数据。但是有一个简单的解决方法:您可以在用户会话中保存POST数据,如果此数据在包含表单的页面上可用,请使用它来绑定表单:

class IssueCreateView(CreateView):
    form_class = IssueForm

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(IssueCreateView, self).form_valid(form)

    def form_invalid(self, form):
        self.request.session['ISSUE_CREATE_FORM_DATA'] = self.request.body
        return HttpResponseRedicect(reverse('form-url'))

在表单视图中:

from django.http import QueryDict

def form_view(request, *args, **kwargs):
    form_data = QueryDict(request.session.pop('ISSUE_CREATE_FORM_DATA', ''))
    form = IssueForm(form_data)
    ...

这需要安装会话中间件('django.contrib.sessions.middleware.SessionMiddleware')。