Django модель foreignkey всегда по умолчанию независимо от того, какой пользователь вошел - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть эта django модель для вопросов.

class Question(models.Model):  
    user    = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, null=True, on_delete=models.SET_NULL)
    question_id          = models.CharField(max_length=150, null=False, default=get_id, unique=True, editable=False)
    question             = models.CharField(max_length=150, null=False)
    question_description = FroalaField()
    created_at           = models.DateTimeField(auto_now=False, auto_now_add=True)
    updated_at           = models.DateTimeField(auto_now=True, auto_now_add=False)
    question_image       = models.ImageField(upload_to=get_upload_path, blank=True, null=True)
    height_field         = models.IntegerField(default=0)
    width_field          = models.IntegerField(default=0)
    dynamic_link         = models.CharField(max_length=225, null=False, default="")
    question_type        = models.CharField( max_length=50, null=False, choices=QUESTIONSTYPE_LIST)
    question_status      = models.CharField(max_length=150, null=False, default="unapproved")
    is_active            = models.BooleanField(default=False)


    objects = QuestionManager()
    class Meta:
        ordering = ['-updated_at']

    def __str__(self):
        return self.question_id

    def get_absolute_url(self):
        kwargs = {
            'questiontype': slugify(self.question_type),
            'questionid': self.question_id,
            'slug': slugify(self.question)
        }
        return reverse("questions:detail", kwargs=kwargs)

Кажется, все работает нормально, за исключением того, что пользователь user = models.ForeignKey (settings.AUTH_USER_MODEL, default) = 1, null = True, on_delete = models.SET_NULL) всегда сохраняет, но значение по умолчанию равно 1. Поэтому независимо от того, какой пользователь вошел в систему и в сеансе, по умолчанию всегда используется значение 1.

Я использую classed-based-views, и пользователь является CustomUser.

У меня customUser установлен в settings.py auth_model_user как:

AUTH_USER_MODEL = 'users.CustomUser'

Вот форма для вопроса :

class QuestionCreationUpdateForm(forms.ModelForm):
    question = forms.CharField(widget=forms.TextInput(attrs={
        'class': 'frm-input',
        'placeholder': _('Enter question title'),
        'autocomplete': 'off'
    }))
    question_type = forms.ChoiceField(choices=QUESTIONSTYPE_LIST, widget=forms.Select(attrs={'class': 'frm-input'}))

    question_description = forms.CharField(widget=FroalaEditor)


    def __init__(self, *args, **kwargs):
        super(QuestionCreationUpdateForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Question
        fields = ('question', 'question_description',  'question_type')

И вопрос CreateView:

# Add Question View
@method_decorator(login_required, name='dispatch')
class AskQuestionView(CreateView):
    template_name = 'ask_question.html'
    form_class = QuestionCreationUpdateForm
    model = Question
    def form_valid(self, form):
        try:
            return super(AskQuestionView, self).form_valid(form)
        except IntegrityError:
            context = {
                'msg': _('We don\'t allow continues posting! Take a break. Try again later!')
            }
            return  render(self.request, "500.html", context)
    def get_success_url(self):

        return self.object.get_absolute_url()

Если я выполняю request.user в файле views.py, я всегда получаю нужного пользователя.

Так почему моя модель ведет себя так странно?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Вы не назначаете ни одного пользователя на Question.user. Вам необходимо присвоить текущему пользователю это поле.

@method_decorator(login_required, name='dispatch')
class AskQuestionView(CreateView):
    template_name = 'ask_question.html'
    form_class = QuestionCreationUpdateForm
    model = Question
    def form_valid(self, form):
        try:
            <b>form.instance.user = self.request.user</b>
            return super(AskQuestionView, self).form_valid(form)
        except IntegrityError:
            context = {
                'msg': _('We don\'t allow continues posting! Take a break. Try again later!')
            }
            return  render(self.request, "500.html", context)

Подробнее читайте Модели и request.user

1 голос
/ 10 февраля 2020

Как я вижу, вам нужно назначить объект User для экземпляра формы. Как это:

@method_decorator(login_required, name='dispatch')
class AskQuestionView(CreateView):
    ...

    def form_valid(self, form):
        try:
            <b>obj = form.save(commit=False)
            obj.user = self.request.user</b>
            return super(AskQuestionView, self).form_valid(<b>obj</b>)
        except IntegrityError:
            context = {
                'msg': _('We don\'t allow continues posting! Take a break. Try again later!')
            }
            return  render(self.request, "500.html", context)  
            <b># ^^ consider using a 400 error response, as 500 is for server error response. 400 is for bad request</b>
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...