1

我正在编写一个 Django 应用程序,需要使用 AJAX 请求更新模型,该请求仅包含模型字段的子集作为键。所以如果我有模型

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 中有没有一种惯用的方法来做到这一点?在此先感谢您的帮助。

4

1 回答 1

1

首先,GET请求不应该更新数据。他们应该只读取和显示数据。您需要使用的 HTTP 方法是POST. 这个答案值得一读。

现在已经不碍事了,实现你想要的最好方法是使用泛型UpdateView. 这是一些示例代码:

# urls.py
from views import UpdateTheModelView

urlpatterns = patterns('',
                       url(r'^update-TheModel/(?P<pk>\d+)/?',
                       UpdateTheModelView.as_view(),
                       name='update_the_model'),
)


# forms.py
from django import forms
from models import TheModel

class TheModelForm(forms.ModelForm):
    class Meta:
        model = TheModel
        fields = ('a', 'b', 'c', 'd',)


# views.py
from django.core.urlresolvers import reverse
from django.views.generic import UpdateView
from models import TheModel
from forms import TheModelForm

class UpdateTheModelView(UpdateView):
    model = TheModel
    form_class = TheModelForm
    template_name = 'themodel_form.html'

    def get_success_url(self):
        """
        Just here to redirect back to the update page when the form is posted
        """
        return reverse('update_the_model', args=[self.object.id, ])

还有一个简单的示例模板,用于在以下位置显示表单yourapp/templates/themodel_form.html

<form action="." method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Update" />
</form>

因此,现在如果您有TheModel一个 id 为的 saved实例1,您可以查看加载了初始数据的更新表单http://your-website.co.uk/update-TheModel/1/,您可以通过单击Update或向此页面的 URL 发送 POST 请求(连同CSRF 令牌)来更新它),这可以在后台使用 jQuery 或 vanilla Javascript 轻松完成。

于 2013-07-22T02:18:25.157 回答