我正在尝试练习一个简单的项目:用户注册(使用 Django registration-redux
),上传一些文件,然后她/他会得到一个文件列表,可以下载.下面分别是我的 models.py、forms.py 和 View :
模型.py
class UserProfile(models.Model):
user = models.ForeignKey(User, related_name='uploaded_by')
names = models.CharField(max_length=40)
lastname = models.CharField(max_length=50)
email = models.EmailField()
uploads = models.FileField(upload_to= 'blablabla')
def __str__(self):
return self.email
表单.py
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ['names', 'uploads']
view.py
from .forms import UserProfileForm
from .models import UserProfile
@login_required()
def new(request):
form = UserProfileForm(request.POST or None, request.FILES or None)
if form.is_valid():
form.save()
context = {'title': 'welcome', 'form': form}
return render(requst, 'upform.html', context)
然而,当我以用户身份登录并尝试上传文件时,出现错误:IntegrityError at/new NOT NULL 约束失败:_userprofile.user_id
经过大量挖掘后,我注意到有人提出错误的原因是因为在发布表单的过程中无论如何都没有包含用户,所以我尝试了我想到的任何事情以及我添加用户字段的情况到 forms.py 工作:
表单.py
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ['names', 'uploads']
但问题是浏览器中显示的表单现在包含一个包含所有注册用户的下拉列表。我试图通过不断看到不同的错误将登录用户与 View 中的表单相关联。 我的问题是:如何以透明的方式将上传与登录用户相关联。 对不起,如果这个问题太新手喜欢
最佳答案
让用户远离表单并在保存时添加:
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.save()
我必须说你的模型看起来有点奇怪;每个用户都有多个配置文件,每个配置文件都有一个上传。您似乎更需要一个与用户具有 OneToOne 关系的单个配置文件,而不是具有到 UserProfile 的外键的单独上传模型。
关于python - Django NOT NULL 约束在上传文件时失败 userprofile.user_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32942529/