Проблема с мастером форм Django при создании пользователя - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь создать двухэтапную форму создания пользователя с помощью формы мастера django, у меня есть файл изображения, который идет в модель профиля, а все остальные данные идут в пользовательскую модель по умолчанию, это правильный путь делать это или я должен создать единую модель для всего. Не знаю точно, что я сделал не так. Я подозреваю, что моя вторая форма не знает, для какого пользователя она должна сохранить данные. Я новичок, поэтому, ребята, пожалуйста, помогите мне.

models.py

from django.db import models
from django.contrib.auth.models import User
from PIL import Image

# Create your models here.

class Profile(models.Model):
    user = models.OneToOneField(User, default=None, null=True, on_delete=models.CASCADE)
    profilePic = models.ImageField(default='default.png', upload_to='profilePics')

    def __str__(self):
        return self.user.username

    def save(self):
        super().save()

        img = Image.open(self.profilePic.path)

        if img.height > 500 or img.width > 500:
            outputSize = (500,500)
            img.thumbnail(outputSize)
            img.save(self.profilePic.path)


forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from formtools.wizard.views import SessionWizardView
from .models import Profile


class UserRegisterForm(UserCreationForm):
    email= forms.EmailField(required=True ,max_length=100,widget= forms.TextInput(attrs={'placeholder':'jane@example.com'}))

    class Meta:
        model = User
        fields = ['username', 'email', 'password1' ]
        widgets = {
            'username': forms.fields.TextInput(attrs={'placeholder': 'the_jane'}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        del self.fields['password2']



class UserDetialsForm(forms.ModelForm):
    firstName = forms.CharField(required=True, max_length=100, widget= forms.TextInput(attrs={'placeholder':'Jane'}))
    lastName = forms.CharField(required=True, max_length=100, widget= forms.TextInput(attrs={'placeholder':'Doe'}))

    class Meta:
        model = User
        fields = ['firstName', 'lastName']

    class Meta:
        model = Profile
        fields = ['profilePic']

views.py

from django.shortcuts import HttpResponseRedirect, render, redirect, reverse
from django.core.files.storage import DefaultStorage
from django.forms.models import construct_instance
from .forms import *
from . models import Profile

# Create your views here.

def index(request):
    return render(request, 'blog/index.html')

def home(request):
    return render(request, 'blog/home.html')

def login(request):
   form = UserLoginForm
   context = {'form':form}
   return render(request, 'blog/login.html', context)


class FormWizardView(SessionWizardView):
    template_name = "blog/register.html"
    form_list = [UserRegisterForm, UserDetialsForm]
    file_storage = DefaultStorage()
    instance = None

    def get_form_instance( self, step ):
        if self.instance is None:
            self.instance = Profile()
        return self.instance

    def done(self, form_list, **kwargs):
        self.instance.save()
        return render(self.request, 'blog/home.html', {
        'form_data': [form.cleaned_data for form in form_list],
    })

это ошибка

return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: blog_profile.user_id
[06/Mar/2020 19:16:32] "POST /register/ HTTP/1.1" 500 172958

https://drive.google.com/open?id=1MXIGfcuEM_jzovfdmzY5jHy5n5Lywcbc

если вам, ребята, нужно что-нибудь еще, пожалуйста, дайте мне знать.

спасибо .

...