在Django中,用户可以上传带有图像的评论。
from sorl.thumbnail import ImageField
class Comment(models.Model):
count_votes = models.Integer(default=0)
user = models.ForeignKey(User)
thumb = ImageField(upload_to="thumbnails")
# ...
这就是我想要做的事情:
# views.py
def add_comment(request):
if request.method == 'POST' and request.user.is_authenticated():
comment = Comment(user=request.user)
form = CommentForm(request.POST, request.FILES, instance=comment)
if form.is_valid():
form.save()
# ...
# forms.py
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
但是有一些错误:
count_votes
默认为0 我怎样才能实现这一目标?我已经阅读了很多关于SO的问题并尝试了其他各种方法,例如填写表单__init__
中的内容,使用initial
代替instance
,...
答案 0 :(得分:0)
首先,请确保您的模板中的enctype="multipart/form-data"
标记中包含<form>
,否则图片文件将无法上传,您的表单也无法验证(因此,不会将任何内容添加到数据库)。
此外,您需要修复视图。首先使用login_required
decorator,以便您的视图仅限于已登录的用户,然后修复表单逻辑:
from django.shortcuts import redirect, render
from django.contrib.auth.decorators import login_required
@login_required
def add_comment(request):
form = CommentForm(request.POST or None, request.FILES or None)
if form.is_valid():
obj = form.save(commit=False) # create the record, but don't save it
obj.user = request.user # add the user from the request
obj.save() # now save the record
return redirect('/')
return render(request, 'template.html', {'form': form})
最后,在您的表单中排除用户,因为您稍后会添加它。实际上,您的表单应该只有注释和图像字段。您不需要包含count_votes
字段,因为它已经有一个默认值;除非您希望用户修改此字段。
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('thumb', 'comment',)