【问题标题】:Django - OneToOneField keeps returning NoneDjango - OneToOneField 不断返回 None
【发布时间】:2020-08-22 02:13:30
【问题描述】:

我的 OneToOneField 不断返回 None。我尝试访问我的网站,以便表单可以自动将帖子的作者作为当前登录的人。我环顾四周,发现 OneToOneField 可以做到这一点。当我实际上在 User 模型中有用户时,它会一直返回 None 。地球上发生了什么?

Models.py: - 这是主要问题发生的地方

from django.db import models
from datetime import datetime
from django import forms
from django.forms import ModelForm
from django.contrib.auth.models import User
from django.conf import settings
from django.contrib.auth import get_user_model



class MainPost(models.Model):
    post_author = models.OneToOneField(User, on_delete=models.CASCADE)
    post_title = models.CharField(max_length=200)
    post_content = models.TextField()
    post_published = models.DateTimeField("date published", default=datetime.now())



    def __str__(self):
        return self.post_title

class MainPostForm(ModelForm):
    class Meta:
        model = MainPost
        fields = ["post_title", "post_content", "post_author"]
        readonly_fields = "post_published"

Views.py - 重要的是底部的 create_request()

from django.shortcuts import render, redirect
from django.shortcuts import render, redirect
from django import forms
from django.http import HttpResponse
from django.views.generic import CreateView
from django.contrib.auth.forms import AuthenticationForm
from .models import MainPost, MainPostForm
from .forms import NewUserForm

from django.contrib import messages
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.models import User
from datetime import datetime

def homepage(request):
    return render(request, template_name="trymysite/home.html", context=             
    {"posts":MainPost.objects.order_by('-post_published')})

def register(request):
    if request.method == "POST":
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get("username")
            messages.success(request, f"New Account Created: {username}")
            login(request, user)
            messages.info(request, f"You are now logged in as {username}")
            return redirect("mymainapp:homepage")  # Goes to urls and to the homepage path

        else:
            for msg in form.error_messages:
                messages.error(request, f"{msg}: {form.error_messages[msg]}")

    form = NewUserForm
    return render(request, "trymysite/register.html", context={"form": form})


def login_request(request):
    if request.method == "POST":
        form = AuthenticationForm(request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                messages.info(request, f"You are now logged in as {username}")
                return redirect("mymainapp:homepage")
            else:
                messages.error(request, "Invalid username or passowrd!")
        else:
            messages.error(request, "Invalid username or passowrd!")

    form = AuthenticationForm()
    return render(request, "trymysite/login.html", {"form":form})

def logout_request(request):
    logout(request)
    messages.info(request, "Logged out Successfully!")
    return redirect("mymainapp:homepage")

def create_request(request):
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = MainPostForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            form.save()
            return redirect("mymainapp:homepage")

    form = MainPostForm()

 return render(request, "trymysite/create.html", {"form":form})from django import forms

Forms.py - 这是用户注册的一部分,以防出现问题

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User



class NewUserForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")

    def save(self, commit=True):
        user = super(NewUserForm, self).save(commit=False)
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user

请帮忙

【问题讨论】:

  • 首先把default=datetime.now()改成default=datetime.now

标签: python django


【解决方案1】:

试试这个:

def create_request(request):
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = MainPostForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            main_post = form.save(commit=False)
            main_post.post_author = request.user
            main_post.save()
            return redirect("mymainapp:homepage")

    form = MainPostForm()
    return render(request, "trymysite/create.html", {"form":form})

【讨论】:

  • 干杯@TestEmail!!
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2011-03-28
  • 2020-10-08
  • 2022-01-13
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多