Django:保存ModelForm的模型对象

时间:2013-05-26 07:23:38

标签: django

我有一个ModelForm:

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的IntegrityError   comp_app_image.user_id可能不是NULL

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

  

INSERT INTO“comp_app_image”(“name”,“image”,“user_id”)VALUES('','gray-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
谢谢Jacinda。现在我得到了更清洁的代码:

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

但错误null user_id仍然存在。

2 个答案:

答案 0 :(得分:2)

如果此表单只能由登录用户访问,请使用login_required装饰器,并且应始终在POST之后重定向。您还应该阅读ModelForms文档中的this section;其中描述了如何正确使用具有有限字段的模型表单。

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})  

答案 1 :(得分:1)

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

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

当我尝试使用你的语法时(使用Django默认的django.contrib.auth)我在'user'上得到一个KeyError。

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

username = request.user.username

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

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