我有一个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
仍然存在。
答案 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
当然,这只有在您的用户需要登录才能上传图片时才有效。