【问题标题】:How to save a field after commit=False with model Form in Django?如何在 Django 中使用模型表单在 commit=False 后保存字段?
【发布时间】:2012-11-06 10:37:34
【问题描述】:

我有一个模型:

class Book(models.Model):
    name = models.CharField(max_length=100)
    alias = models.CharField(max_length=100)
    description = models.TextField()


    def __unicode__(self):
        return self.name

和 forms.py 中的 ModelForm:

class BookForm(ModelForm):
class Meta:
    model = Book

所以我试图在我的观点中做出这样的事情:

def register_book(request):
if request.method == 'POST':
    formul = BookForm(request.POST)
    if formul.is_valid():
        new_book=formul.save(commit=False)
        new_book.alias='foo'
        new_book.save()
        return HttpResponseRedirect('/')

所以,我正在从 html“表单”中保存名称和描述,但在获得表单后我需要保存别名。但不工作。

【问题讨论】:

  • 保存表单时返回什么错误?
  • 您的if formul.is_valid():支票的else在哪里?

标签: python django forms model


【解决方案1】:

默认情况下,ModelForm 将包含并验证模型的所有字段。如果您始终在视图中自己分配 alias 值,那么您不需要表单中的 alias 字段,您可以将其排除:

class BookForm(ModelForm):

    class Meta:
        model = Book
        fields = ('name', 'description')
        # NOTE: you can also use excludes, but many consider it a bad practice

与往常一样,Django docs 可以为您提供更多信息。

【讨论】:

  • 谢谢你刚刚解决了我的表单验证问题。
【解决方案2】:

您正在尝试先保存没有别名的模型。您需要先允许空白值,然后才能执行此操作。推荐的方法是使用blank:

alias = models.CharField(max_length=100, blank=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多