我正在尝试使用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'}
同样用于更新类型。
有没有好办法呢?
答案 0 :(得分: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
警告,这种方法会有一些怪癖,可能需要更多的黑客才能工作。如果您对此视图的一个字段执行了常规的非ajax POST,并且表单无效,我认为在呈现模板时所有其他字段都将消失。
答案 1 :(得分:0)
为什么不简单地创建一个表单 - 比如AjaxUpdateNameForm
- 然后使用django-ajax-validation来处理ajax请求?