Ajax и ModelForm для обновления модели - PullRequest
3 голосов
/ 04 января 2012

Я пытаюсь обновить модель, используя 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'}

И также для обновления типа.

Есть ли хороший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 05 января 2012

Почему бы вам просто не создать форму, скажем, AjaxUpdateNameForm, а затем использовать django-ajax-validation для обработки запросов Ajax?

0 голосов
/ 05 января 2012

Мне не понятно, почему вы хотите это сделать.Я не уверен, что экономия эффективности, связанная только с отправкой измененных полей, оправдывает повышенную сложность представления.

Однако, если вы действительно хотите это сделать, я бы попытался переопределить метод 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

Предупреждение, этот подход будет иметь некоторые причуды и, возможно, потребуется еще немногоРабота.Если вы выполнили обычное POST без Ajax для одного поля в этом представлении, и форма была недействительной, я думаю, что все остальные поля исчезнут при визуализации шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...