python - 如何将提交 ModelForm 的用户的信息传递到 ManyToMany 保存?
问题描述
我正在尝试使用 CreateView 从 Django ModelForm 将记录插入到交集表中,但我不确定如何访问当前登录用户的信息。我已经尝试过 request.user 但我不知道将它放在我的视图或表单中的哪个位置,并且每次我得到相同的错误“'school_id'列中的空值违反非空约束”。所有其他值都是正确的。有人可以教我正确的方法吗?我真的很感激。
我试图把它放在我的视图中,但它没有用:
def form_valid(self, form):
form.instance.applicant = self.request.user
g = Group.objects.get(name='PendingApplicants')
g.user_set.add(self.request.user)
for program in form.cleaned_data['programs']:
pro = tblProgramSchool()
pro.application_id = self.object
pro.program = program
pro.school = self.request.user.mainschool
pro.save()
return super().form_valid(form)
我在我的表格中尝试了这个,但它也没有奏效:
def save(self, commit=True):
instance = forms.ModelForm.save(self, False)
old_save_m2m = self.save_m2m
def save_m2m():
old_save_m2m
instance.programs.clear()
for program in self.cleaned_data['programs']:
instance.programs.add(program = program, school = self.request.user.mainschool)
self.save_m2m = save_m2m
instance.save()
self.save_m2m()
return instance
我知道我错过了一些基本的东西,但是在阅读了一堆答案和 Django 文档之后,我感到迷茫。
模型.py
class Application(models.Model):
id = models.AutoField(primary_key=True)
applicant = models.ForeignKey('users.CustomUser', null = False, blank = False, on_delete=models.PROTECT)
programs = models.ManyToManyField(tblProgram, blank = True, through = tblProgramsSchool)
class tblProgramsSchool(models.Model):
id = models.AutoField(primary_key=True)
school = models.ForeignKey(tblSchool, on_delete=models.PROTECT)
program = models.ForeignKey(tblProgram, on_delete=models.PROTECT)
application = models.ForeignKey('Application', on_delete=models.PROTECT)
class tblProgram(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, null = False, blank = False)
description = models.CharField(max_length = 200, null = True, blank = True)
class CustomUser(AbstractUser):
"""A model for a custom user"""
...
mainschool = models.ForeignKey(tblSchool, on_delete=models.PROTECT, null=True, blank=True)
...
表格.py
class ApplicationForm(forms.ModelForm):
class Meta:
model = Application
fields = ['programs', ...
]
labels = {
'programs': 'Please select the programs you know of', ...
}
help_texts = {
'programs': 'Leave blank if there are no programs at your school'
}
widgets = {
'programs': CheckboxSelectMultiple()
}
视图.py
class ApplicationView(LoginRequiredMixin, CreateView):
form_class = ApplicationForm
success_url = 'success'
template_name = 'apply.html'
login_url = 'login'
def form_valid(self, form):
form.instance.applicant = self.request.user
g = Group.objects.get(name='PendingApplicants')
g.user_set.add(self.request.user)
return super().form_valid(form)
解决方案
万一有人偶然发现了这个问题,我发现了问题。
这需要在基于类的视图中:
def get_form_kwargs(self):
kwargs = super(ApplicationView, self).get_form_kwargs()
kwargs.update({'user': self.request.user})
return kwargs
这需要在模型表单中才能访问用户:
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(ApplicationForm, self).__init__(*args, **kwargs)
所以这可以用来填充关联表:
def save_m2m():
old_save_m2m
instance.programs.clear()
for program in self.cleaned_data['programs']:
tblProgramSchool.objects.create(application_id=app.id, school_id=self.user.mainschool.id, program_id=program.id)
推荐阅读
- mysql - MySQL 在多重连接语句中更新,只有第三个表中的最高值
- javascript - 如何在 React 中同步测试?
- python - AWS Lambda - 将 S3 中的多个 CSV 文件合并到一个文件中
- asp.net-mvc - 处理请求时发生未处理的异常。当我想按类别列出产品时出现此错误?
- javascript - 将新元素添加到对象数组并在 HTML 中显示
- algorithm - 在python中有效地查找最近的坐标(Long,Lat)
- r - 使用正则表达式将字符串中的数字替换为四舍五入的数字
- reactjs - “在‘redux’中找不到导出‘createStore’
- terraform - 将多个不同大小的 EBS 卷附加到 EC2 实例
- java - 创建一个扩展 java.io.PrintStream 类的类