3

基本的に私が達成しようとしているのは、異なるモデルが同じビューを利用するマルチモデル 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})
4

3 に答える 3

1

クラスベースのビューを使用するのはどうですか? 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'),

ビュー.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

クラスとフォームを引数としてメソッドに渡し、コードでそれらを呼び出すだけです。

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 に答える