Django使用带有ImageField和User的表单

时间:2014-09-14 09:13:54

标签: django django-forms

在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,...

1 个答案:

答案 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',)