Подтвердить что ты не робот

Как автоматически заполнять поля в django?

У меня есть модель Вопрос с полем userid, перед тем как задать вопрос, нужно войти в систему, я хочу, чтобы при сохранении записывать идентификатор пользователя текущего пользователя и назначать это к userid модели вопроса.

Обратите внимание, что я не показываю идентификатор пользователя в моей форме, то есть в модели вопроса я объявил идентификатор пользователя следующим образом:

class Question (models.Model):   ...  userid = models.ForeignKey(User, editable = false)  ...

Как назначить входной идентификатор пользователя в модель вопроса userid?

4b9b3361

Ответ 1

Ваш код может выглядеть так:

from django.contrib.auth.decorators import login_required

class QuestionForm(forms.ModelForm):
    class Meta:
         model = Question

@login_required
def ask(request):
    form = QuestionForm(request.POST)

    if form.is_valid():
        question = form.save(False)
        question.userid = request.user
        question.save()

    #...

Ответ 2

Эта запись в блоге (Джеймсом Беннеттом) может оказаться полезной и для вас... она излагает способ сделать почти точно что вам нужно.

Ответ 3

Одна вещь, о которой следует помнить, - это тот факт, что вы не можете получить доступ к объекту запроса (и, следовательно, к текущему пользователю) из ваших моделей без взлома вокруг ограничений дизайна django.

Поэтому чистые трюки, такие как автоматическое заполнение полей, таких как created_by и updated_by, не работают из Django. Вы должны установить такие поля вручную в своих представлениях, как показано @Daevaorn.

Ответ 4

Для более недавнего - и, вероятно, обновленного - ресурса, я рекомендую официальную документацию Django. В этом примере он попал в раздел методов ModelAdmin документации администратора: https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#modeladmin-methods

Если вы похожи на меня, у вас возникнет соблазн просто взять этот пример и запустить его, но вам может понадобиться замедлить работу, потратив несколько минут на чтение, а затем реализовать - я бы точно...

Обратите внимание, что я указал на 1.6, но в нижнем правом углу страницы находится динамический селектор, который позволяет вам выбирать вашу версию. (Эти удивительные документы - это то, что подталкивает меня к Django из Rails!)