#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:
Сначала объявите класс модели пользователя, затем класс текстовой модели