Django多模型最佳实践

时间:2013-09-10 15:19:21

标签: python django

基本上我想要实现的是一个多模型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})

3 个答案:

答案 0 :(得分:1)

使用Class Based Views怎么样?使用CBV是Django制作可重用代码的最佳方式。对于这个例子,它可能比基于函数的视图长一点,但是当项目成长时,它会产生不同。还要记住“明确比隐含更好”。

urls.py

# 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'),

views.py

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)

urls.py

url(r'^car/delete/(?<pk>\d+)/', edit, {'model': Car})
url(r'^make/delete/(?<pk>\d+)/', edit, {'model': Make})

views.py

def edit(request, id, model):
    model.objects.get(id=id).delete()