【问题标题】:Django - ModelForm save creating object with null fields?Django - ModelForm 保存创建带有空字段的对象?
【发布时间】:2015-12-16 01:05:34
【问题描述】:

所以我有一个具有 6 个属性的模型,然后是一个具有 3 个属性的模型表单,用于填写这 6 个属性中的 3 个。这 3 个属性之一是图像字段,因此我相信我需要使用 form.save() 将图像保存到 upload_to 位置。但是,当我尝试使用 form.save() 时,它会立即创建一个缺少字段的对象并失败。如何创建一个对象并使用 form.save() 上传图像?不过,我也可能会误解 form.save() 的用户。如果没有 form.save(),图像不会上传到 upload_to 位置。

我的代码在下面......

模型.py

class Posting(models.Model):
    textbook = models.ForeignKey(Textbook)
    condition = models.CharField(max_length = 200)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to='postingpics/%Y/%m/%d', default="../../static/textchange/nophoto.jpg")
    post_date = models.DateTimeField('date_posted')

    def __str__(self):
        return str(self.textbook)

    def was_posted_recently(self):
        return self.post_date >= timezone.now() - datetime.timedelta(days=1)
    was_posted_recently.admin_order_field = 'post_date'
    was_posted_recently.boolean = True
    was_posted_recently.short_description = 'Posted recently'

Forms.py

class PostCreate(ModelForm):
    class Meta:
        model = Posting
        fields = ('price', 'condition', 'image')
    CHOICES = (('New', 'New'), ('Like New', 'Like New'), ('Used', 'Used'), ('Usable', 'Usable'))
    price = forms.DecimalField()
    condition = forms.ChoiceField(choices = CHOICES)
    image = forms.ImageField(required=False)

Views.py

@login_required
def addposting(request, uisbn):
    form = PostCreate(request.POST or None, request.FILES or None)

    # Get textbook with isbn equal to usibn
    ltextbook = Textbook.objects.filter(isbn = uisbn)
    text = ltextbook[0]
    curuser = request.user

    if form.is_valid() and request.POST:
        condition = request.POST.get('condition')
        price = request.POST.get('price')
        image = request.FILES.get('image')
        if image:
            if (not (Posting.objects.filter(Q(user = curuser) & Q(textbook = text)))):
                print("one")
                print("two")
                new = Posting(textbook = text, user = curuser, post_date = datetime.now(), condition=condition, price=price, image = image)
                print("three")
                form.save()
                print("bw")
                new.save()
                print("four")
                return HttpResponseRedirect('/results/' + uisbn)
        else:
            if (not (Posting.objects.filter(Q(user = curuser) & Q(textbook = text)))):
                new = form.save()
                new = Posting(textbook = text, user = curuser, post_date = datetime.now())
                new.save()
                return HttpResponseRedirect('/results/' + uisbn)

    return render_to_response(
        'textchange/addposting.html',
        locals(),
        context_instance=RequestContext(request)
        )

Views.py 中的打印语句仅用于测试和试验。

编辑:

这是错误:

IntegrityError at /results/9781439820643/posting/add “post_date”列中的空值违反非空约束 详细信息:失败行包含(132、New、23.00、null、null、null、postingpics/2015/09/18/office_WnbptWi.png)。

【问题讨论】:

  • post_date 字段不在您的表单中,但在您尝试保存的模型中是必需的。您可以删除 post_date 字段,或确保已填写(添加 auto_now=True)。
  • 如果重新定义字段,ModelForm 有什么用?
  • 我在表单中缺少了 text_id、user_id 和 post_date。所以我需要做 form.save() 来上传图片,但我需要将这 3 个属性附加到保存
  • @Pynchia 我只是使用模型表单来轻松保存图像字段
  • 不,您可以完全控制表单,并且可以挑选您需要的字段并在需要时添加其他字段。模型和表单经过单独的验证。请阅读official django docs

标签: python django forms


【解决方案1】:

我认为您只是没有填写必填字段,因此您将全部填写,或者您可以将模型字段更改为

textbook = models.ForeignKey(Textbook,required=false)
condition = models.CharField(max_length = 200,required=false)
price = models.DecimalField(max_digits=5, decimal_places=2,required=false)
user = models.ForeignKey(User,required=false)
image = models.ImageField(upload_to='postingpics/%Y/%m/%d', default="../../static/textchange/nophoto.jpg",required=false)
post_date = models.DateTimeField('date_posted',required=false)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多