ошибка представления текстовой формы django ‘User’, на которую ссылаются перед назначением

#python #django #django-models #django-forms #django-views

#python #django #django-модели #django-forms #django-представления

Вопрос:

у меня есть это представление, в котором есть 3 формы: форма для входа и одна для регистрации, а другая предназначена для публикации текста в виде сообщения, где этот текст сохраняется в базе данных

вот мой views.py файл

 from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate, logout as django_logout 
from django.contrib import messages
from django.urls import reverse
from .models import *
from .forms import *


def home(request):

    
    user = request.user

    # for rendering texts
    text_form = TextForm()
    signin_form = SigninForm()
    signup_form = SignupForm()

    if request.method == "POST":
        if 'text_form' in request.POST:
            text_form = TextForm(request.POST)
            if text_form.is_valid() and request.user.is_authenticated:
                user = request.user
                obj = text_form.save(commit=False)
                author = User.objects.filter(email=user.email).first()
                obj.author = author
                text_form.save()

        if 'signin_form' in request.POST:
            signin_form = SigninForm(request.POST)
            if signin_form.is_valid():
                email = request.POST['email']
                password = request.POST['password']
                user = authenticate(email=email, password=password)
                if user:
                    login(request, user)
                elif user is None:
                    messages.error(request, 'ُEmail or password is incorrect')

        if 'signup_form' in request.POST:
            signup_form = SignupForm(request.POST)
            if signup_form.is_valid():
                User = signup_form.save()
                full_name = signup_form.cleaned_data.get('full_name')
                email = signup_form.cleaned_data.get('email')
                raw_password = signup_form.cleaned_data.get('password1')
                account = authenticate(email=email, password=raw_password)
                login(request, account)

    texts = Text.objects.all().order_by('-id')

    context = {'signin_form': signin_form,'signup_form': signup_form,'text_form': text_form,'texts': texts}

    return render(request, 'main/home.html', context)
  

в моем models.py

    #the text model

class Text(models.Model):

    title = models.CharField(max_length=200, null=True)
    document = models.TextField(max_length=None, null=True)
    requirements = models.TextField(max_length=200, null=True)
    date_created = models.DateField(auto_now_add=True, null=True)
    deadline = models.DateField(null=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.title
# the user model
class User(AbstractBaseUser):
    email = models.EmailField(verbose_name="Email",max_length=250, unique=True)
    username = models.CharField(max_length=30, unique=True, null=True)
    date_joined = models.DateTimeField(verbose_name='Date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='Last login', auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    full_name = models.CharField(verbose_name="Full name", max_length=150, null=True)
    profile_pic = models.ImageField(null=True, blank=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['full_name']

    objects = MyAccountManager()

    def __str__(self):
        return self.full_name

    # For checking permissions.
    def has_perm(self, perm, obj=None):
        return self.is_admin

    # For which users are able to view the app (everyone is)
    def has_module_perms(self, app_label):
        return True


  

все работает нормально, но когда я пытаюсь создать сообщение, появляется сообщение об ошибке

«локальная переменная «Пользователь», на которую ссылаются перед назначением «

и ошибка находится в следующей строке в views.py

» автор = User.objects.filter (email = user.email).first () «

Комментарии:

1. Удалите User = часть User = signup_form.save() .

2. спасибо, это сработало, но мне пришлось добавить signup_form.save()

Ответ №1:

Попробуйте изменить модели в models.py:

Сначала объявите класс модели пользователя, затем класс текстовой модели