问题描述
我的 UserImg 模型具有一个 user 字段,该字段具有 editable = False 。
model.py
def upload_myimg_path(instance,filename):
return 'documents/{0}/{1}'.format(instance.created_by.username,filename)
class UserImg(models.Model):
user = models.ForeignKey(User,verbose_name=_('Created by'),on_delete=models.CASCADE,editable=False,null=True,blank=True)
name = models.CharField(max_length=100,default='')
image = models.ImageField(upload_to=upload_myimg_path,verbose_name=_('File'))
def __str__(self):
return str(self.user)
forms.py
class UserImgForm(forms.ModelForm):
class Meta:
model = UserImg
fields = '__all__'
views.py
def createuserimg(request):
if request.method == 'POST':
form = UserImgForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('/accounts/users')
else:
return redirect('/accounts/')
else:
form = UserImgForm
return render(request,'accounts/user_form.html',{'form': form})
解决方法
更新您的视图功能以包括当前登录的用户并使用@login_required
装饰器以确保只有登录的用户才能访问此视图:
from django.contrib.auth.decorators import login_required
@login_required
def createuserimg(request):
if request.method == 'POST':
form = UserImgForm(request.POST,request.FILES)
if form.is_valid():
obj = form.save(commit=False) # <-- commit=False does not save to database
obj.user = request.user # <-- this allows you to specify the user for your post
obj.save()
return redirect('/accounts/users')
# if the form did not validated,stay on the same page to display errors to your user
else:
form = UserImgForm()
return render(request,'accounts/user_form.html',{'form': form})
,
正确答案 commit = False允许您在实际将结果对象保存到数据库之前对其进行修改。它对我有用。 非常感谢您的帮助
from django.contrib.auth.decorators import login_required
@login_required
def createuserimg(request):
if request.method == 'POST':
form = UserImgForm(request.POST,request.FILES)
if form.is_valid():
link = form.save(commit=False)
link.user = request.user
link.save()
return redirect('/accounts/users')
# if the form did not validated,{'form': form})