我正在編寫Django應用程序,需要使用AJAX請求更新模型,該請求僅包含模型字段的子集作爲鍵。所以,如果我有模型使用ModelForm更新Django模型的某些字段
class TheModel(models.Model):
a = models.CharField(max_length=16)
b = models.IntegerField()
c = models.TextField()
d = models.ManyToManyField(AnotherModel)
然後我能得到請求像
id=7&a=Hello
id=7&a=Test&b=123
id=13&b=14&c=Description&d=6&d=10
是,我總是會得到ID字段,但其他的任何子集。
我不能找到一個「好」的方式做到這一點在Django 1.5:首先我想
instance = get_instance_or_404(request["id"])
data = django.forms.models.model_to_dict(instance)
data.update(request.POST)
form = TheModelForm(data, instance=instance)
if form.is_valid():
form.save()
...
else:
...
,但這似乎並沒有與M2M領域很好地工作,而且model_to_dict感覺令我難以置信的醜陋。所以我也沒有
instance = get_instance_or_404(request["id"])
for k in TheModel._meta.fields:
if k in request:
setattr(instance, k, request[k])
try:
instance.full_clean()
except ValidationError as e:
...
instance.save()
但我不完全明白如何處理這裏的m2m領域。
在Django中有這樣做的習慣嗎?在此先感謝您的幫助。
m2m字段由'model.m2m_field.add()'和'model.m2m_field.remove()'更新,這兩個函數都帶有一個arg,它是要添加或刪除的項目的實例。 –
感謝您提供有用的提示,但是我真的很想找到一種方法來做到這一點,這與使用ModelForm中的所有數據創建模型實例一樣好,並且可以立即識別。如果沒有別的,我希望能夠通過主鍵添加到m2m_field,而不是通過實例來保存大量的樣板。 – Actorclavilis