Django更新模型表单

时间:2013-01-14 22:01:04

标签: django django-forms django-views

我有一个模型形式:

class UserPreferencesForm(ModelForm):
    """
    Form for storing user preferences.
    """
    class Meta:
        model = UserPreferences
        exclude = ('user')

模特:

class UserPreferences(models.Model):
    """
    Model for user project preferences.
    """
    user = models.OneToOneField(User)
    ...

并在视图中:

    ...
    form = UserPreferencesForm(request.POST or None)
    if form.is_valid():
        # save the form
        prefs = form.save(commit=False)
        prefs.user = request.user
        prefs.update()
        messages.add_message(
            request, messages.INFO, 'Your preferences have been updated.'
        )
    ...

我想确保每个用户只有一组首选项,所以我想重构视图代码以使用update()模型方法的内容,而不是检查对象是否存在然后保存,这将产生更多的疑问。

“创建或更新”模型的最有效方法是什么?

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

您是否有兴趣保存查询以检测是否存在行?

在这种情况下,您可以按照您的描述进行操作..执行更新并检查是否更新了0行,这意味着配置文件不存在。

updated = Preferences.objects.filter(user=request.user).update(**form.cleaned_data)
if updated == 0:
    # create preference object

但更简单的设计模式是确保通过models.signals.post_save类发送的User信号监听每个用户始终有一个偏好表。

然后,您可以假设它始终存在。

def create_prefs(sender, instance, created, **kwargs):
     if created:
         # create prefs

models.signals.post_save.connect(create_prefs, sender=User)
相关问题