Django - Как связать текущего аутентифицированного пользователя с данными, предоставленными формой - PullRequest
1 голос
/ 03 октября 2019

Извините, если вопрос слишком простой, но я прочитал документацию и многие статьи, и ни одна из них, похоже, не отвечает на мой вопрос.

Я хочу связать опубликованную форму пользователя с этим пользователем вБД, поэтому я могу запросить данные, предоставленные для каждого конкретного пользователя, и использовать удаление в CASCADE в случае, если пользователь удален.

Я попытался создать модель, а затем ModelForm на основе этой модели. Я добавил поле с именем «user» в Model как ForeignKey, поэтому в ModelForm переводится в ModelChoiceField, который, кстати, скрыт, поскольку пользователь не должен изменять это значение. Но когда я пытаюсь обновить пользовательское поле в views.py, ничего не происходит, форма сохраняется в БД, но пользовательское поле остается как None или Null в БД.

models.py

class Foo(models.Model):
    user = models.ForeignKey(User, related_name='+', on_delete=models.CASCADE)

forms.py

class FooForm(ModelForm):
    class Meta:
        model = Foo
        fields = ['user', 'field1', 'field2']
        exclude = ['user']

views.py

def index(request):
    if request.user.is_authenticated:
        if request.method == 'POST':
        foo = FooForm(request.POST)
        if foo.is_valid():
            foo.save(commit=False)
            foo.user = request.user 
            foo.save()

Я получил опубликованную форму, сохраненную в БД, но поле пользователя имеет значение NULL. Пожалуйста, скажите мне, если вы видите какие-либо ошибки в моем коде или есть лучший способ добиться того, чего я хочу. Заранее спасибо.

1 Ответ

0 голосов
/ 03 октября 2019

Вы совсем близко. Но foo - это форма , а не экземпляр. Вы можете изменить экземпляр, написав foo.instance.user = request.user. Например:

from django.contrib.auth.decorators import login_required

@login_required
def index(request):
    if request.user.is_authenticated:
        if request.method == 'POST':
        foo = FooForm(request.POST)
        if foo.is_valid():
            <b>foo.instance.user = request.user</b>
            foo.save()
    # &hellip;

Вы, вероятно, хотите украсить свой вид с помощью декоратора @login_required [Django-doc] , такого, что в случае отсутствияаутентифицированный пользователь, он будет перенаправлен на страницу входа.

...