Как я могу передать пользовательский объект в форму, используя Django - PullRequest
0 голосов
/ 15 мая 2018

Я новичок в django, я создал свою модель пользовательского (auth_user).Мне нужно создать регистрационную форму студента, используя пользовательскую модель в соответствии с моим пользовательским объектом

У меня есть две модели Название, пользователь, как это:

from django.db import models
#from django.contrib.auth.models import User
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.contrib.auth.models import AbstractUser

class Title(models.Model):
value = models.CharField(max_length=100, null=True, blank=True)

def __str__(self):
    return self.value

class Meta:
    db_table = 'title'

class User(AbstractUser):
title = models.ForeignKey(Title, on_delete=models.CASCADE, null=True, blank=True)
class Meta:
    db_table = 'user'

settings.py:

AUTH_USER_MODEL = 'student.User'

Здесь у меня есть поле заголовка ForeignKey и поля пользователя по умолчанию first_name, last_name, email, password

My forms.py:

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.core import validators
from student.models import User
from student.models import Title

class StudentRegistrationForm(forms.Form):
filenumber = forms.CharField(label='Filenumber', max_length=45)

class StudentNewRegistrationForm(forms.ModelForm):

title = forms.CharField(required=True)
username = forms.CharField(required=True)
first_name = forms.CharField(required=True)
last_name = forms.CharField(required=True)
email = forms.EmailField(required=True)
password1 = forms.CharField(required=True)
password2 = forms.CharField(required=True)


def __init__(self, *args, **kwargs):
    super(StudentNewRegistrationForm, self).__init__(*args, **kwargs)
    self.fields['title'] = forms.ModelChoiceField(queryset=Title.objects.all(), empty_label='Choose a title',required=False)

class Meta:
    model = User
    fields = ['title','username', 'first_name', 'last_name','email' 'password1', 'password2']

def save(self, commit=True):
    user = super(StudentNewRegistrationForm, self).save(commit=False)
    user.username = self.cleaned_data['username']
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']
    user.email = self.cleaned_data['email']
    user.title = self.cleaned_data['title']
    user.password1 = user.set_password(self.cleaned_data['password1'])
    user.password2 = user.set_password(self.cleaned_data['password2'])

    if commit:
        user.save()
    return user

Здесь у меня есть ответ API, как показано ниже:

{"candidate":{"firstname":"Testuser","lastname":"test","salutation":10000,"email":"testing@gmail.com","username":"test"}}

Этот ответ приходит из studentregistrationview:

from django.shortcuts import render, redirect
from django.urls import reverse
from student.forms import RegistrationForm
from django.contrib.auth import get_user_model
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required
from .forms import StudentRegistrationForm, StudentNewRegistrationForm
import requests
from django.http import JsonResponse
from django.http import HttpResponse
#from django.contrib.auth import get_user_model
from student.models import User
from student.models import Title
import json
import urllib
from django.conf import settings
from django.contrib import messages

def studentregistration(request):
form = StudentRegistrationForm()
if request.method == 'POST':
    form = StudentRegistrationForm(request.POST)
    if form.is_valid():
        data = form.cleaned_data
        inputdata = data.get('filenumber')
        url = 'https://myapiurl/' + inputdata
        result = requests.get(url)
        finalresult = result.json()
        studentapires = {'studentres': finalresult}
        request.session['studentapires'] = studentapires
        return redirect('/student/studentnewregistration')

else:
    form = StudentRegistrationForm()
return render(request, 'student/studentregister.html', {'form': form})

Я создаю новый пользовательский объект, как показано ниже, и я попытался сохранить объект, здесь объект выпуска не сохраняется в пользовательской таблице

представление student_new_registration, я пытался создать новый объект User, как показано ниже

student_new_registration.py:

def student_new_registration(request):
studentapires = request.session.get('studentapires', None)
jsonresult = studentapires['studentres']['candidate']
user = User()

if jsonresult['salutation'] == 100000000:
    salutation = 'Mister'
elif jsonresult['salutation'] == 100000002:
    salutation = 'Madam'

title = Title.objects.get(value=salutation)
user.title = title
user.first_name = jsonresult['firstname']
user.last_name = jsonresult['lastname']
user.email = jsonresult['email']
user.username = jsonresult['username']

if request.method == 'POST':
    form = StudentNewRegistrationForm(request.POST, instance=user)
    if form.is_valid():
        form.save()
        return HttpResponse("Registration Completed")
    return HttpResponse("Please Check Your Registration Form")

else:
    form = StudentNewRegistrationForm(instance=user)
    args = {'form': form}
    return render(request, 'student/studentnewregistrationform.html', args)

Ошибка:

full_clean() missing 1 required positional argument: 'self', form is not submitting (means form not going inside form.is_valid())

studentnewregistrationform.html:

{% extends 'base.html' %}

{% block head %}
<title>Student Profile Form</title>
{% endblock %}

{% block body %}
<div class="container">
<form method="post">
    {% csrf_token %}
    <div class="row">
    <div class="col-sm-4">
         <h3> Student&nbsp;Profile&nbsp;Form</h3>
    </div>
    </div>
    <br>

    <div class="row">
        <div class="col-sm-2">{{ form.title.label }}</div>
        <div class="col-sm-3">{{ form.title }}</div>
        <div class="col-sm-4">{{ form.title.errors }}</div>
    </div>
     <br>
    <div class="row">
        <div class="col-sm-2">{{ form.first_name.label }}</div>
        <div class="col-sm-3">{{ form.first_name }}</div>
        <div class="col-sm-4">{{ form.first_name.errors }}</div>
    </div>
     <br>
    <div class="row">
        <div class="col-sm-2">{{ form.last_name.label }}</div>
        <div class="col-sm-3">{{ form.last_name }}</div>
        <div class="col-sm-4">{{ form.last_name.errors }}</div>
    </div>
    <br>
    <div class="row">
        <div class="col-sm-2">{{ form.email.label }}</div>
        <div class="col-sm-3">{{ form.email }}</div>
        <div class="col-sm-4">{{ form.email.errors }}</div>
    </div>
    <br>
    <br>
    <div class="row">
        <div class="col-sm-2">{{ form.username.label }}</div>
        <div class="col-sm-3">{{ form.username }}</div>
        <div class="col-sm-4">{{ form.username.errors }}</div>
    </div>
    <br>
    <div class="row">
        <div class="col-sm-2"><label for="{{ form.password1.label }}">Password</label></div>
        <div class="col-sm-3">{{ form.password1 }}</div>
        <div class="col-sm-4">{{ form.password1.errors }}</div>
    </div>
    <br>
   <div class="row">
        <div class="col-sm-2"><label for="{{ form.password2.id_for_label }}">ConfirmPassword</label></div>
        <div class="col-sm-3">{{ form.password2 }}</div>
        <div class="col-sm-4">{{ form.password2.errors }}</div>
    </div>
    <br><br>
    <div class="row">
        <div class="col-sm-2 col-sm-offset-2"> <input type="submit" name="submit" value="Submit" class="btn btn-primary"/></div>
        <div class="col-sm-2"></div>
    </div>
</form>
</div>
{% endblock %}

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

Manager isn't available; 'auth.User' has been swapped for 'student.User'

пожалуйстапомогите мне, спасибо заранее ...

1 Ответ

0 голосов
/ 16 мая 2018

Вам необходимо изменить модель User внутри вашего файла views.py и любых других файлов, в которых вы используете класс User.К новой модели.Для этого попробуйте добавить следующий импорт:

from django.contrib.auth import get_user_model
User = get_user_model()

вместо

from django.contrib.auth.models import User
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...