Django 表单动态获取作者作为模型表单中的登录用户

Django forms dynamic getting author as a logged in user in model forms

我正在尝试制作一些允许用户添加、删除或编辑对象的表单,但我一直坚持使用模型作者之类的东西。假设我们得到了 field

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

因为我已经创建了自定义用户模型来通过我想要的一些字段来扩展用户,然后我们创建了 modelForm,创建了视图等,最后得到了表单。当我们尝试提交此表单时,它不会将表单中提交的对象添加到 db,因为表单没有填写字段 author author,这意味着该字段 == Null,这就是它不会将其添加到 db 的原因。所以我的问题是如何让它动态化,例如,当昵称 "thebestuser" 的用户尝试添加此 modelForm 时,它会起作用并将作者标记为 "thebestuser"? Ofc 我可以添加到表单字段作者,但在我看来这是最糟糕的方式,然后每个用户都被允许添加对象,例如作为另一个用户,假设具有 nick "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)

您需要在您的视图中执行此操作。当您保存表单时,将 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