【问题标题】:Django - unique_together option with override save method in formDjango - unique_together 选项与表单中的覆盖保存方法
【发布时间】:2013-01-26 18:40:51
【问题描述】:

当用户在表单中保存数据而不是使用 django 管理员时,我想使用 unique_together 选项。

models.py:

from django.db import models
from django.contrib.auth.models import User

class ezApp(models.Model):
    name = models.SlugField(max_length=50, unique=True )
    date_created = models.DateTimeField('date created', auto_now_add=True)
    date_updated = models.DateTimeField('date updated', auto_now=True)
    created_by = models.ForeignKey(User)
    in_use = models.BooleanField()

    class Meta:
        unique_together = (('name', 'created_by'),)

forms.py

from django.forms import ModelForm
from django.forms.models import BaseModelFormSet
from ezApp.models import *

class BaseEzAppFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(BaseEzAppFormSet, self).__init__(*args, **kwargs)

    def save_new(self, form, commit=True):
        obj = form.save(commit=False)
        obj.created_by = self.user
        if commit:
             obj.save()
        return obj

views.py:

from django.shortcuts import *
from ezApp.models import *
from django.forms.models import modelformset_factory
from django.http import HttpResponseServerError
from ezApp.forms import *

def createEzAppInstance(request):
    if request.method == 'POST':
            ezAppFormSet = modelformset_factory(ezApp, extra=1, fields=('name'), formset=BaseEzAppFormSet)
            formset = ezAppFormSet(request.POST, request.FILES, user=request.user)
            if formset.is_valid():
                formset.save()

        return render_to_response("ezApp/manage_new_ezApp.html", {'formset': formset, 'title': "New App"}, context_instance=RequestContext(request))
else:
    error_msg = u"You are not logged in"
    return HttpResponseServerError(error_msg)

在模型的 Meta 中使用 unique_together,验证仅在 django admin 内部有效,但在我使用表单保存新数据时无效。

【问题讨论】:

  • 是否是复制/粘贴问题,但 Meta 类的缩进应该与 ezApp 中的字段相同
  • 发布视图代码,您是否正在验证表单集?为什么在表单集中使用 save_new 而不是覆盖表单的 save() 方法并调用 Super()?
  • 同时发布您的表单代码!
  • 意见和表格已发布!谢谢

标签: django django-models django-forms


【解决方案1】:

正如 msc 指出的那样,您需要覆盖 save 方法而不是自己编写。

def save(self, *args, **kwargs):
    obj = super(BaseEzAppFormSet, self).save(form, *args, commit=False, **kwargs)
    obj.created_by = self.user
    obj.save()
    return obj

看起来您的 save_new() 方法从未在您的视图中被调用过。

【讨论】:

  • 实际上我使用 new_save() 将 request.user 从表单传递到模型以在创建新 ezApp 期间自动填充 created_by
  • 我知道这就是代码的用途。我只是看不到你在哪里使用过它。 save_new() 永远不会被调用。您正在调用 formset.save() 而不是 formset.save_new()
  • BaseModelFormSet 中的 save_new() 会覆盖模型的 save()。我可以向你保证,它被称为。这就是我从这篇文章中了解到的streamhacker.com/2010/03/01/django-model-formsets
  • 好的,看源码,好像save_new()是被save()调用的(它不会覆盖save)。如果您在 save_new() 的定义中包含对 super 的调用,您的代码可能更易于维护。无论如何,我正在对我的问题进行 +1 学习(我可能会删除我的答案 - 这是错误的)。
  • 好的,没问题,谢谢您的帮助。我也从你的回答中学到了一些东西。我想我现在会放弃我的应用程序中的 unique_together,并在 ezApp 名称字段选项中保留 unique=True 选项,即使我更愿意让不同的用户创建具有相同名称的应用程序实例。
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多