IntegrityError: поле FK (user_id) остается нулевым, несмотря на переопределение form_valid () - PullRequest
0 голосов
/ 11 апреля 2019

Пользователь должен иметь возможность регистрировать активность в модели Activity_Log, но форма CreateView должна автоматически заполнять user_id от текущего вошедшего в систему пользователя.

Я расширил таблицу django auth_user для отношений OnetoOne в другую модель с именем Profile ( users-profile ). user_id - это поле ForeignKey, автоматически добавляемое в мою модель профиля (я вижу его в MySQL WorkBench), и это PrimaryKey в модели auth_user.

Однако я получаю IntegrityError (1048: 'user_id' не может быть 'null'), несмотря на использование def form_valid (self, form) переопределение в LogCreateView. I пробовал несколько вариантов form_valid () из примеров StackOverflow, но безрезультатно.

Все мои 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'

1 Ответ

0 голосов
/ 11 апреля 2019

Ваш внешний ключ для модели Profile Activity_Log.staffrowid.

Это означает, что вы должны установить form.instance.staffrowid, если вы используете экземпляр модели, или form.instance.staffrowid_id, если вы используете идентификатор.

form.instance.staffrowid = self.request.user.profile

Обратите внимание, что поскольку staffrowid является внешним ключом для Profile, я использовал self.request.user.profile вместо self.request.user. Вам может понадобиться код для обработки случая, когда профиль не существует для пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...