Формы, Модель и обновление с текущим пользователем - PullRequest
1 голос
/ 09 мая 2020

Я думаю, что это работает, но я натолкнулся на пару вещей, прежде чем заставить его работать, что я хочу понять лучше, так что вопрос. Также похоже, что другие люди делают это разными способами, глядя на другие ответы на переполнение стека. Чего я пытаюсь избежать, так это того, чтобы пользователь выбирал свое имя пользователя из раскрывающегося списка при создании нового профиля поиска. Модель профиля поиска:

class Search_Profile(models.Model):
    author_of_profile = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True)
    keyword_string = models.CharField(max_length=200)
    other_stuff = models.CharField(max_length=200)

Форма, которую я получил, была:

class Search_Profile_Form(ModelForm):
    class Meta:
        model = Search_Profile
        fields = [ 'keyword_string', 'other_stuff']

Где я намеренно не включил «author_of_profile», чтобы он не отображался или не нужен подлежит проверке. Я попытался скрыть это, но тогда форма не сохранялась в модели, потому что поле не было введено. Если бы я был в порядке с раскрывающимся списком, я бы, наверное, оставил его.

У меня не было проблем с HTML при тестировании на полноту:

  <form action="" method="POST">
    {% csrf_token %}
    {{ form.author_of_profile}}
    {{ form.keyword_string }}
    {{ form.other_stuff }}
    <input type="submit" value="Save and Return to Home Page">
  </form>

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

def New_Profile(request):
    if request.method=='POST':
        form = Search_Profile_Form(request.POST)
        if form.is_valid():
            post=form.save(commit=False)
            # here is where I thought I could update the author of profile  field  somehow with USER
            # but If I include the author_of_profile field in the form it seems I can't.
            post.save()
            #So instead I tried to update the author_of profile directly in the model
            current_profile=Search_Profile.objects.last()
            current_profile.author_of_profile=request.user
            current_profile.save()
            return(redirect('home'))
    else:
        form=Search_Profile_Form()
    return render(request, 'mainapp/New_Profile.html', {'form': form})

Итак, несколько вопросов: для внешнего ключа в поле author_of_profile лучше использовать blank = True или null = True. В итоге я использовал request.user вместо импорта из django .contrib.auth.models import Пользователь есть ли разница ? Мой реальный вопрос, однако, является ли приведенное выше разумным способом получить данные формы и обновить базу данных с помощью этих данных и пользователя? Или мне не хватает другого способа, который больше встроен?

1 Ответ

0 голосов
/ 09 мая 2020
post=form.save()
current_profile.author_of_profile=request.user
post.save()

return(redirect('home'))

попробуйте что-нибудь вроде этого. сохраните форму в db, затем снова смените автора. save(commit=False) не сохраняет дату в базе данных сразу.

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