用户应该能够将活动登录到Activity_Log模型中,但是CreateView表单必须自动填充当前登录用户的user_id。
我已经将OnetoOne关系上的django auth_user 表扩展到另一个名为Profile( users-profile )的模型中。 user_id 是自动添加到我的Profile模型(在MySQL WorkBench中可以看到)的ForeignKey字段,并且是auth_user模型中的PrimaryKey。
但是,尽管在LogCreateView中使用了 def form_valid(self,form)覆盖,我还是遇到了IntegrityError(1048:“ user_id”不能为“ null”)。 >我已经尝试了StackOverflow示例中的form_valid()的几种变体,但无济于事。
我的POST变量都是其他字段的正确输入,这些字段的正确输入形式为'projectrowid','activityid','startdatetime','enddatetime','comments',但user_id不会与POST变量一起传递给Activity_Log模型。
任何有关如何正确覆盖def form_valid()的建议,将不胜感激!
views.py-LogCreateView
class LogCreateView(LoginRequiredMixin, CreateView):
model = Activity_Log
fields = ['projectrowid', 'activityid', 'startdatetime', 'enddatetime', 'comments']
def get_template_names(self):
if self.request.user.is_superuser:
template_name = 'Administrator/activity_log_form.html'
return template_name
else:
template_name = 'Staff/activity_log_form.html'
return template_name
def form_valid(self, form):
form.instance.user_id = self.request.user.id
return super(LogCreateView, self).form_valid(form)
models.py-ActivityLog模型
class Activity_Log(models.Model):
logentryid = models.AutoField(db_column='logEntryID', primary_key=True)
activityid = models.ForeignKey('Activity_Type', models.DO_NOTHING, db_column='activityID', verbose_name= _('Activity ID'))
projectrowid = models.ForeignKey('Project', models.DO_NOTHING, db_column='projectRowID',verbose_name= _('Project Name'))
staffrowid = models.ForeignKey('users.Profile', on_delete=models.CASCADE, db_column='user_id',
verbose_name=_('Staff Alias'))
startdatetime = models.DateTimeField(db_column='startDateTime', default=datetime.datetime.now(), verbose_name= _('Activity Start (Date and Time: yyyy-mm-dd hh:mm:ss)'))
enddatetime = models.DateTimeField(db_column='endDateTime', default=datetime.datetime.now(), verbose_name= _('Activity End (Date and Time: yyyy-mm-dd hh:mm:ss)'))
comments = models.CharField(max_length=150)
users \ models.py-配置文件模型
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
stafftypeid = models.ForeignKey('Administrator.Staff_Type', models.DO_NOTHING, db_column='staffTypeID')
employeeid = models.CharField(max_length=20)
alias = models.CharField(max_length=20)
department = models.CharField(max_length=150)
organization = models.CharField(max_length=150)
fte = models.DecimalField(max_digits=4, decimal_places=1, default=Decimal(100.0))
class Meta:
unique_together = [('alias',), ('employeeid',)]
db_table = 'users-profile'
答案 0 :(得分:0)
您对Profile
模型的外键是Activity_Log.staffrowid
。
这意味着,如果您使用模型实例,则应设置form.instance.staffrowid
,如果使用id,则应设置form.instance.staffrowid_id
。
form.instance.staffrowid = self.request.user.profile
请注意,由于staffrowid
是Profile
的外键,因此我使用了self.request.user.profile
而不是self.request.user
。您可能需要代码来处理用户不存在配置文件的情况。