Django формирует динамическое получение автора как зарегистрированного пользователя в модельных формах - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь создать несколько форм, которые позволят пользователям добавлять некоторые объекты, удалять их или редактировать, но я придерживался такой вещи, как автор модели.Допустим, у нас есть модель Shot, у которой есть поле

author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

Поскольку я создал пользовательскую модель пользователя, чтобы расширить пользователя на некоторые поля, которые я хочу, а затем мы создаем modelForm, создаем представления и т. Д. И, наконец, получили форму,Когда мы попытаемся отправить эту форму, он не будет добавлять этот объект, отправленный в форму, в базу данных, потому что форма не имеет автора заполненного поля, что означает это поле == Null, и поэтому оно не будет добавлять это в базу данных.Поэтому мой вопрос заключается в том, как сделать его динамичным, например, когда пользователь с ником «thebestuser» попытается добавить эту модель. Он будет работать и пометить автора как «thebestuser»?Конечно, я мог бы добавить к автору поля формы, но, на мой взгляд, это худший способ, и каждый пользователь мог бы добавить объект, например, как другой пользователь, скажем, пользователь с ником "anothernick" мог добавить форму как пользователь с "thebestuser ", который, по моему мнению, неприемлем.

models.py

from django.db import models
from django.contrib.auth.models import User
from streamers.models import Streamer
from django.conf import settings
from django.utils import timezone


class Shot(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=70)
    url = models.CharField(max_length=100)
    streamer = models.ForeignKey(Streamer, on_delete=models.CASCADE)
    published_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

forms.py

from django import forms
from .models import Shot

class AddShot(forms.ModelForm):
    class Meta:
        model = Shot
        fields = [
            'title',
            'url',
            'streamer',
        ]
views.py
@login_required
def add_shot(request):
    form = AddShot(request.POST or None)
    if form.is_valid():
        form.save()
        instance = form.save(commit=False)
        instance.published_date = request.published_date
        instance.author = request.user
        instance.save()

    context = {
        'form': form
    }

    return render(request, 'shots/add_shot.html', context)

1 Ответ

1 голос
/ 26 марта 2019

Вам нужно будет сделать это по вашему мнению. Когда вы сохраняете форму, передайте commit=False в свой метод сохранения, добавьте своего пользователя, а затем сохраните возвращенный экземпляр.

def my_view(request):
  form = AddShot(request.POST)
  instance = form.save(commit=False)
  instance.author = request.user
  instance.save()

Документировано здесь: https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the-save-method

...