Как автоматически заполнять поля в django?
У меня есть модель Вопрос с полем userid, перед тем как задать вопрос, нужно войти в систему, я хочу, чтобы при сохранении записывать идентификатор пользователя текущего пользователя и назначать это к userid модели вопроса.
Обратите внимание, что я не показываю идентификатор пользователя в моей форме, то есть в модели вопроса я объявил идентификатор пользователя следующим образом:
class Question (models.Model): ... userid = models.ForeignKey(User, editable = false) ...
Как назначить входной идентификатор пользователя в модель вопроса userid?
Ответы
Ответ 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!)