每当我提交表单时,数据都会添加到数据库中,但我收到错误
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>
答案 0 :(得分:2)
ModelFormMixin.form_valid
将self.object
设置为新创建的对象,然后由get_success_url
使用。在self.object = obj
中尝试form_valid
,get_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'
)。