NOT NULL constraint failed: products_product.vendor_id django
недавно я изменил форму пользователя проекта на абстрактного базового пользователя и мои пользователи не могут добавлять товары или просматривать свой профиль, я знаю, что проблема в views.py и forms.py, но на что бы я ее не изменил, все равно есть некоторые проблемы, помимо ошибки в заголовке.
views.py
rom django.urls import reverse_lazy
from django.views import generic
from django.contrib.auth.forms import UserChangeForm
from django.utils.text import slugify
from django.shortcuts import render, redirect
from .models import NewUser
from products.models import Product
from .forms import ProductForm
from .forms import UserCreationForm
# Create your views here.
def become_vendor(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
vendor = NewUser.objects.create(user_name=user.first_name)
return redirect('home')
else:
form = UserCreationForm()
return render(request, 'vendor/become_vendor.html', {'form': form})
@login_required
def vendor_admin(request):
context = {
'user':request.user
}
vendor = request.user.user_name
return render(request,'vendor/vendor_admin.html',{'vendor': vendor ,'context':context})
@login_required
def add_house(request):
if request.method == 'POST':
form = ProductForm (request.POST, request.FILES)
if form.is_valid():
product = form.save(commit=False)
NewUser.user_name = request.user.user_name
product.slug = slugify(product.عنوان)
product.save()
return redirect('vendor_admin')
else:
form = ProductForm()
return render(request,'vendor/add_house.html',{'form': form})
class UserEditView(generic.UpdateView):
models = NewUser
form_class = UserChangeForm
template_name = 'vendor/edit_profile.html'
seccess_url = reverse_lazy('vendor_admin')
def get_object(self):
return self.request.user
forms.py
rom django.forms import ModelForm
from products.models import Product
from django import forms
from django.contrib.auth.models import Group
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from .models import NewUser
class ProductForm(ModelForm):
class Meta:
model = Product
fields =['نوع_قرارداد','عنوان','تصاویر','قیمت','توضیحات']
class RegistrationForm(forms.ModelForm):
password = forms.CharField(label='Password', widget=forms.PasswordInput)
class Meta:
model = NewUser
fields = ( 'user_name', 'email','phone','password')
def save(self, commit=True):
# Save the provided password in hashed format
user = super().save(commit=False)
user.set_password(self.cleaned_data["password"])
if commit:
user.save()
return user
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='رمزعبور', widget=forms.PasswordInput)
password2 = forms.CharField(label='تایید رمزعبور', widget=forms.PasswordInput)
class Meta:
model = NewUser
fields = ('user_name', 'email' ,'phone', 'profile_pic',)
def clean_password2(self):
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("گذرواژه ها مطابقت ندارند")
return password2
def save(self, commit=True):
# Save the provided password in hashed format
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField()
class Meta:
model = NewUser
fields = ( 'user_name','email','phone', 'about', 'profile_pic',)
def clean_password(self):
return self.initial["password"]
Я не знаю, могут ли модели быть проблемой или нет, но я добавляю их в любом случае
models.py
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
class CustomAccountManager(BaseUserManager):
def create_superuser(self, email, user_name, first_name, password, **other_fields):
other_fields.setdefault('is_staff', True)
other_fields.setdefault('is_superuser', True)
other_fields.setdefault('is_active', True)
if other_fields.get('is_staff') is not True:
raise ValueError(
'Superuser must be assigned to is_staff=True.')
if other_fields.get('is_superuser') is not True:
raise ValueError(
'Superuser must be assigned to is_superuser=True.')
return self.create_user(email, user_name, first_name, password, **other_fields)
def create_user(self, email, user_name, first_name, password, **other_fields):
if not email:
raise ValueError(_('لطفا یک ادرس ایمیل بدهید'))
email = self.normalize_email(email)
user = self.model(email=email, user_name=user_name,
first_name=first_name, **other_fields)
user.set_password(password)
user.save()
return user
def get_profile_image_filepath(self,filename):
return f'uploads/{self.pk}/{"profile.png"}'
def get_default_profile_image():
return "uploads/profiled.png"
class NewUser(AbstractBaseUser, PermissionsMixin):
email = models.CharField(_('ایمیل'),max_length=255 ,unique=True)
user_name= models.CharField(_('نام کاربری'),max_length=255, unique=True)
first_name = models.CharField(_('نام مسکن'),max_length=255 , blank=True)
phone = models.CharField(_('شماره همراه'),max_length=50, blank=True)
تاریخ_ثبت_نام = models.DateTimeField(verbose_name='تاریخ_ثبت_نام', auto_now_add=True)
اخرین_ورود = models.DateTimeField(verbose_name='اخرین_ورود', auto_now=True)
about = models.TextField(_(
'درباره شما'), max_length=500, blank=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
profile_pic = models.ImageField(_('عکس پروفایل'),max_length=255 ,upload_to=get_profile_image_filepath,null=True ,blank=True, default=get_default_profile_image)
objects = CustomAccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['user_name', 'first_name']
def __str__(self):
return self.user_name
def get_profile_image_filenames(self):
return str(self.profile_pic)[str(self.profile_pic).index(f'uploads/{self.pk})/'):]
пожалуйста, примите во внимание тот факт, что я новичок в django я очень прошу помощи для моего проекта и если была допущена какая-либо другая ошибка, пожалуйста, сообщите мне, я буду очень признателен за это.