【发布时间】: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