3

Ajax/POSTを使用してモデルを更新しようとしています。フォームのすべてのフィールドではなく、更新中のフィールドを送信できるようにしたいと思います。しかし、これによりフォームが無効になるようです。これを行う良い方法はありますか?

例えば:

class Video(models.Model):
    name = models.CharField(max_length=100)
    type = models.CharField(max_length=100)
    owner =  models.ForeignKey(User, related_name='videos')
    ...
    #Related m2m fields
    ....

class VideoForm(modelForm):
    class Meta:
        model = Video
        fields = ('name', 'type', 'owner')

class VideoCreate(CreateView):
    template_name = 'video_form.html'
    form_class = VideoForm
    model = Video

名前を更新するときに、このデータを使用してPOSTを送信したい

{'name': 'new name'} 

とは対照的に

{'name': 'new name', 'type':'existing type', 'owner': 'current owner'}

同様にタイプを更新します。

これを行う良い方法はありますか?

4

2 に答える 2

0

なぜあなたがこれをしたいのか私にはわかりません。変更されたフィールドのみを送信することによる効率の節約が、ビューの複雑さを増す価値があるかどうかはわかりません。

ただし、本当にやりたい場合は、メソッドをオーバーライドし、フィールドを決定するためにget_form_classを使用してモデルフォームクラスを生成してみます。request.POST

以下はテストされていません。

# in your question you are subclassing CreateView, but
# surely you want UpdateView if you are changing details.
class VideoCreate(UpdateView):
    template_name = 'video_form.html'
    model = Video

    get_form_class(self):
        """
        Only include posted fields in the form class
        """
        model_field_names = self.model._meta.get_all_field_names()
        # only include valid field names
        form_field_names = [k for k in request.POST if k in model_field_names]

        class VideoForm(modelForm):
           class Meta:
               model = Video
               fields = form_field_names

        return VideoForm

警告、このアプローチにはいくつかの癖があり、機能するにはさらにハッキングが必要になる可能性があります。このビューに対して1つのフィールドに対して通常の非ajaxPOSTを実行し、フォームが無効だった場合、テンプレートがレンダリングされたときに他のすべてのフィールドが消えると思います。

于 2012-01-04T21:24:23.253 に答える
0

単純にフォームを作成して(たとえば)、django-ajax-validationAjaxUpdateNameFormを使用してajaxリクエストを処理してみませんか?

于 2012-01-05T00:12:53.780 に答える