【问题标题】:Form save is not adding user to model表单保存未将用户添加到模型
【发布时间】:2020-11-10 03:06:57
【问题描述】:

我有一个 django 模型和 ModelForm,但是当我制作一个新的身体时,一切正常,除了没有创建用户。所有 post.user 属性都不返回。我正在使用 contrib.auth 登录用户,它的工作原理与我的 html user.is_authenticated 作品中一样

我尝试使用:

form.user=request.user
form.save()

无济于事。

任何帮助将不胜感激

Models.py

from django.db import models
from datetime import datetime
from django.contrib.auth.models import User
from django.urls import reverse
# Create your models here.

class Post(models.Model):
    body = models.TextField(max_length=140)
    timestamp = models.DateField(db_index=True, default=datetime.utcnow)
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

    class Meta:
        ordering = ['-timestamp']

    def __repr__(self):
        return '<Post {}>'.format(self.body)
    
    def get_absolute_url(self):
        return reverse('post', args=[str(self.id)])

Forms.py

from django.forms import ModelForm
from .models import Post
from django.core.exceptions import ValidationError

class PostForm(ModelForm):
    def clean_body(self):
        data = self.cleaned_data['body']
        if len(data) > 140:
            raise ValidationError('More than 140 characters')
        return data
    class Meta:
        model = Post
        fields = ['body']

views.py

from django.contrib.auth.decorators import login_required
from django.urls import reverse
from django.core.paginator import Paginator
from django.shortcuts import redirect, render
from .models import Post
from .forms import PostForm
from django.contrib.auth.models import User
# Create your views here.

@login_required
def index(request):
    '''deal with post method first'''
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect(reverse('index'))
    
    else:
        form = PostForm
    
    posts = Post.objects.all()
    paginator = Paginator(posts, 3)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {
        'form':form,
        'page_obj':page_obj
    }
    return render(request, 'index.html', context=context)

【问题讨论】:

    标签: python django


    【解决方案1】:

    一个form没有user,你应该修补包裹在表单中的.instance,所以:

    @login_required
    def index(request):
        '''deal with post method first'''
        if request.method == 'POST':
            form = PostForm(request.POST)
            if form.is_valid():
                form.instance.user = request.user
                form.save()
                return redirect('index')
        # …

    您可能希望将auto_now_add=True parameter 用于timestamp

    class Post(models.Model):
        body = models.TextField(max_length=140)
        timestamp = models.DateField(db_index=True, auto_now_add=True)
        user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    
        # …

    注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation

    【讨论】:

    • timestamp = models.DateField(db_index=True, default=datetime.utcnow)timestamp = models.DateField(db_index=True, auto_now_add=True)有什么区别?
    • @Jjkivai:它将设置editable=Falseblank=True,例如默认情况下该字段不会显示在表单中。但总的来说,您可以将其视为稍微“高级别的”,这通常更好,因为如果出现新功能,它们可以为DateField(auto_now_add=True) 做特定的事情。最后对于DateTimeField,它将使用timezone.now,这是datetime.now 的时区敏感变体。
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2016-10-12
    • 2021-06-28
    • 2011-04-06
    相关资源
    最近更新 更多