Как я могу создать форму, совместимую с моими пользовательскими моделями в django и как я могу преобразовать свою страницу администратора, чтобы содержать пользователей такого типа? - PullRequest
0 голосов
/ 15 марта 2020

файл models.py:

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.db.models.signals import post_save
from django.dispatch import receiver
class User(AbstractUser):
    is_taxpayer = models.BooleanField(default=False)
    is_official = models.BooleanField(default=False)
    username = models.CharField(max_length=200, unique=True)
    email = models.EmailField(max_length=200, unique=True)
class TaxpayerProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='taxpayer_profile')
    aadhar = models.DecimalField(max_digits=12, decimal_places=0)
class OfficialProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True,  related_name='official_profile')
    aadhar = models.DecimalField(max_digits=12, decimal_places=0)
    uid = models.CharField(max_length=200)
    USERNAME_FIELD = 'uid'
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    print('****', created)
    if instance.is_taxpayer:
        TaxpayerProfile.objects.get_or_create(user = instance)
    else:
        OfficialProfile.objects.get_or_create(user = instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
     print('_-----')    
     #  print(instance.internprofile.bio, instance.internprofile.location)
     if instance.is_taxpayer:
        instance.taxpayer_profile.save()
     else:
        OfficialProfile.objects.get_or_create(user = instance)

Вот файл forms.py:

from django import forms
from .models import User, TaxpayerProfile, OfficialProfile
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['username', 'email']

class TaxpayerProfileForm(forms.ModelForm):
    class Meta:
        model = TaxpayerProfile
        fields = ['aadhar']

class OfficialProfileForm(forms.ModelForm):
    class Meta:
        model = OfficialProfile
        fields = ['aadhar', 'uid']

Вот файл views.py:

from django.contrib.auth import login
from django.shortcuts import redirect, render
from django.http import HttpResponse, HttpResponseRedirect
from django.views.generic import CreateView
from .forms import OfficialProfileForm, TaxpayerProfileForm, UserForm
from .models import User, TaxpayerProfile, OfficialProfile

def taxpayer_profile_view(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST)
        taxpayer_profile_form = TaxpayerProfileForm(request.POST)

        if user_form.is_valid() and taxpayer_profile_form.is_valid():
            user = user_form.save(commit=False)
            user.save()
            user.taxpayer_profile.aadhar = taxpayer_profile_form.cleaned_data['aadhar']
            user.taxpayer_profile.save()
            return HttpResponse('thanks')

        else:
            user_form = UserForm()
            taxpayer_profile_form = TaxpayerProfileForm()
            return render(request, 'accounts/taxpayer_profile.html', {'user_form':user_form, 'taxpayer_profile_form':taxpayer_profile_form})

    else:
        user_form = UserForm()
        taxpayer_profile_form = TaxpayerProfileForm()
        return render(request, 'accounts/taxpayer_profile.html', {'user_form':user_form, 'taxpayer_profile_form':taxpayer_profile_form})


def official_profile_view(request):
if request.method == 'POST':
    user_form = UserForm(request.POST)
    official_profile_form = OfficialProfileForm(request.POST)

    if user_form.is_valid() and official_profile_form.is_valid():
        user = user_form.save(commit=False)
        user.save()
        user.official_profile.aadhar = official_profile_form.cleaned_data['aadhar']
        user.official_profile.uid = official_profile_form.cleaned_data['uid']
        user.officialr_profile.save()
        return HttpResponseRedirect('/thanks/')

    else:
        user_form = UserForm()
        official_profile_form = OfficialProfileForm()
        return render(request, 'official_profile.html', {'user_form':user_form, 'official_profile_form':official_profile_form})

else:
    user_form = UserForm()
    official_profile_form = OfficialProfileForm()
    return render(request, 'officialr_profile.html', {'user_form':user_form, 'official_profile_form':official_profile_form})

Вот форма html для налогоплательщика

<form method="post">
    {% csrf_token %}
    {{ user_form.as_p }}
    {{ taxpayer_profile_form.as_p }}
    <button type="submit">Save changes</button>
</form>

Пожалуйста, помогите мне в этом. У меня возникают следующие проблемы:

  1. Я не могу создать учетную запись администратора, хотя я точно выполнил admin.site.register (Пользователь), он показывает уникальную ошибку для электронной почты
  2. Когда я ввожу значения в поля формы, создается только объект User, а объект TaxpayerProfile не создается
  3. Я не могу ни одного объекта класса User по идентификатору. Я провел отладку целый день, но не могу разрешить что угодно.
...