1

我有一个模型表单:

class UploadForm(forms.ModelForm):  
    class Meta:
        model = Image
        fields = ['image']

这是基于模型Image

class Image(models.Model):
    def content_file_name(instance, filename):
        return filename

    name = models.CharField(max_length=50)
    image = models.ImageField(upload_to=content_file_name)
    user = models.ForeignKey(MyUser, related_name='image')  

在views.py 中,我尝试将图像名称和用户对象(来自会话)与上传的图像一起保存到数据库中。

    form1 = UploadForm(request.POST, request.FILES)
    if form1.is_valid():
        image = request.FILES['image']  # image is of UploadedFile class
        form1.Meta.model.name = image.name
        form1.Meta.model.user = get_object_or_404(MyUser,username=request.session['user'])
        form1.save()
        return render(request, '16_upload01.html', context)

问题是只有上传的图像被保存。浏览器中的错误消息:

/competition-big/big1/upload comp_app_image.user_id 处的 IntegrityError 可能不为 NULL

我通过检查 SQL 命令确认了这一点:

插入“comp_app_image”(“name”,“image”,“user_id”)值('','grey-160-100_1.png',无)


我认为图像名称和用户不受限制form1但我怎样才能做到这一点?


编辑
经过一番挖掘,我知道我搞砸了上面的代码。现在我将代码更改为:

if form1.is_valid():
        form1.cleaned_data['user'] = get_object_or_404(MyUser, username=request.session['user'])
        form1.save()

但我仍然得到null user_id错误。

编辑2
谢谢杰辛达。现在我得到了这个更清晰的代码:

if form1.is_valid():
        form1.cleaned_data['user'] = request.user
        form1.save()

但错误null user_id仍然存​​在。

4

2 回答 2

2

如果此表单只能由登录用户访问,请使用login_required装饰器,并且您应该始终在POST. 您还应该阅读ModelForms 文档中的这一部分;它描述了如何正确使用具有有限字段的模型表单。

from django.shortcuts import redirect
from django.contrib.auth.decorators import login_required

@login_required
def your_view(request):
  form1 = UploadForm(request.POST, request.FILES)
  if form1.is_valid():
      image = request.FILES['image']  # image is of UploadedFile class
      obj = form1.save(commit=False)
      obj.name = image.name
      obj.user = request.user
      obj.save()
      return redirect('your-view-name')
  else:
      return render(request, 'form.html', {'form': form1})  
于 2013-05-26T08:03:43.070 回答
1

我认为您的问题可能是这一行:

form1.Meta.model.user = get_object_or_404(MyUser,username=request.session['user'])

当我尝试使用您的语法(使用 Django 默认 django.contrib.auth)时,我在“用户”上得到一个 KeyError。

当我需要有关与请求关联的用户的信息时,我总是这样做:

username = request.user.username

参考:https ://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.user

当然,这仅在您的用户需要登录才能上传图像时才有效。

于 2013-05-26T07:55:59.827 回答