基本上我想要实现的是一个多模型django应用程序,其中不同的模型利用相同的视图。例如,我有模型'Car''Make''Model'等,我想构建一个单独的视图来为每个执行相同的任务,例如添加,删除和编辑,所以我不必创建添加汽车,屁股等的单独视图。我为每个人构建了一个ModelForm和Model对象,并且在编辑时(通过表单实例arg)添加和预先填充的表单对象时想要创建一个空白对象,通过url参数确定对象。
我被困在哪里是因为我不确定最好的方法是什么。目前我正在使用if语句加载来根据我给出的参数返回所需的对象或表单,当不同的表单需要指定以及是否需要实例时,这会变得有点棘手。虽然这似乎远非实现这一目标的最有效方式。
Django似乎有覆盖大多数重复任务的功能,我在这里缺少一些魔法吗?
编辑 - 这是我正在使用我传入url的参数所做的一个例子:
def edit_object(request, object, id):
if(object==car):
form = carForm(instance = Car.objects.get(pk=id)
return render(request, 'template.html', {'form':form})
答案 0 :(得分:1)
使用Class Based Views怎么样?使用CBV是Django制作可重用代码的最佳方式。对于这个例子,它可能比基于函数的视图长一点,但是当项目成长时,它会产生不同。还要记住“明确比隐含更好”。
# Edit
url(r'^car/edit/(?P<pk>\d+)/$', EditCar.as_view(), name='edit-car'),
url(r'^make/edit/(?P<pk>\d+)/$', EditMake.as_view(), name='edit-make'),
# Delete
url(r'^car/delete/(?P<pk>\d+)/$', DeleteCar.as_view(), name='delete-car'),
url(r'^make/delete/(?P<pk>\d+)/$', DeleteMake.as_view(), name='delete-make'),
class EditSomethingMixin(object):
"""Use Mixins to reuse common behavior"""
template_name = 'template-edit.html'
class EditCar(EditSomethingMixin, UpdateView):
model = Car
form_class = CarForm
class EditMake(EditSomethingMixin, UpdateView):
model = Make
form_class = MakeForm
class DeleteSomethingMixin(object):
"""Use Mixins to reuse common behavior"""
template_name = 'template-delete.html'
class DeleteCar(DeleteSomethingMixin, DeleteView):
model = Car
class DeleteMake(DeleteSomethingMixin, DeleteView):
model = Make
答案 1 :(得分:0)
只需将您的类和表单作为args传递给方法,然后在代码中调用它们。
def edit_object(request, model_cls, model_form, id):
form = model_form(instance = model_cls.objects.get(pk=id)
return render(request, 'template.html', {'form':form})
然后只需在视图方法中传递正确的类和表单
def edit_car(request,id):
return edit_object(request, Car, CarForm, id)
每个方法都知道要传递的类,所以你要删除if语句。
答案 2 :(得分:0)
url(r'^car/delete/(?<pk>\d+)/', edit, {'model': Car})
url(r'^make/delete/(?<pk>\d+)/', edit, {'model': Make})
def edit(request, id, model):
model.objects.get(id=id).delete()