3

基本上我想要实现的是一个多模型 django 应用程序,其中不同的模型利用相同的视图。例如,我有模型“汽车”“制造”“模型”等,我想构建一个视图来为每个视图执行相同的任务,例如添加、删除和编辑,所以我不必创建一个单独的视图,用于添加汽车、屁股制造等。我已经为每个构建了一个 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})
4

3 回答 3

1

使用基于类的视图怎么样?使用 CBV 是 Django 中制作可重用代码的最佳方式。对于这个例子,它可能比基于函数的视图长一点,但是当项目长大时,它会有所不同。还要记住“显式优于隐式”。

网址.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'),

视图.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
于 2013-09-12T07:28:37.607 回答
0

网址.py

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

视图.py

def edit(request, id, model):
    model.objects.get(id=id).delete()
于 2013-09-10T17:14:37.207 回答
0

只需将您的类和表单作为参数传递给方法,然后在代码中调用它们。

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 语句。

于 2013-09-10T16:42:28.360 回答