我正在尝试做的是功能视图的Django样板。这里的任何帮助都非常感谢,因为文档显示了模板视图和列表视图的示例,但我发现基于模型的通用视图很少。我在文档中遗漏了一个例子吗?
我有一个代表日历中条目的模型。拥有该条目的另一个对象(不是用户)有一个外键。我想要做的只是创建条目,确保正确设置条目的外键,然后将用户返回到相应的日历页面。
我不知道,基于类的通用视图如何接收其URL参数,我不清楚如何设置success_url以便它重用最初传递给创建URL的id。再次感谢您的帮助。
我要问的是,基本上是基于类的通用视图是什么,等同于:
def create_course_entry(request, class_id):
'''Creates a general calendar entry.'''
if request.method == 'POST':
form = CourseEntryForm(request.POST)
if form.is_valid():
new_entry = form.save(commit=False)
new_entry.course = Class.objects.get(pk=class_id)
new_entry.full_clean()
new_entry.save()
return HttpResponseRedirect('/class/%s/calendar/' % class_id)
else:
form = CourseEntryForm()
return render_to_response('classes/course_entry_create.html',
{ 'class_id': class_id, 'form': form, },
context_instance=RequestContext(request))
答案 0 :(得分:23)
您可以继承edit.CreateView
通用视图,在dispatch()
方法中设置类/课程,并通过覆盖form_valid()
方法保存:
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.views.generic.edit import CreateView
class CourseEntryCreateView(CreateView):
form_class = CourseEntryForm
model = CourseEntry
def dispatch(self, *args, **kwargs):
self.course = get_object_or_404(Class, pk=kwargs['class_id'])
return super(CourseEntryCreateView, self).dispatch(*args, **kwargs)
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.course = self.course
self.object.save()
return HttpResponseRedirect(self.get_success_url())
如果您没有自定义CourseEntryForm
ModelForm
,那么您可以省略form_class
属性。
不幸的是,无法在super()
方法中调用form_valid()
- 由于它的编写方式意味着该对象将再次保存。
如果您需要模板上下文中的Class(course?)实例,那么您可以在get_context_data()
方法中添加它:
def get_context_data(self, *args, **kwargs):
context_data = super(CourseEntryCreateView, self).get_context_data(
*args, **kwargs)
context_data.update({'course': self.course})
return context_data
答案 1 :(得分:6)
替代Matt Austin的答案可能是覆盖get_form
方法:
from django.shortcuts import get_object_or_404
from django.views.generic import CreateView
class CourseEntryCreateView(CreateView):
form_class = CourseEntryForm
model = CourseEntry
def get_form(self, form_class):
form = super(CustomCreateView, self).get_form(form_class)
course = get_object_or_404(Class, pk=self.kwargs['class_id'])
form.instance.course = course
return form
这样,.course
位于上下文中的CourseEntry
实例上,以及在POST时保存表单时创建的实例。