मैंने उपयोगकर्ता मॉडल को बढ़ाया और उपयोगकर्ताओं से ग्राहक मॉडल में एक से एक संबंध बनाया। हालांकि, जब भी मैं ग्राहक पृष्ठ को कॉल कर रहा हूं तो उपयोगकर्ता मॉडल के फ़ील्ड वहां प्रस्तुत नहीं किए जाते हैं। यह पहले नाम को नाम, अंतिम नाम और ईमेल पते के रूप में प्रस्तुत करने के बजाय केवल एक फ़ील्ड, फ़ील्ड नाम में ग्राहक मॉडल में उपयोगकर्ता नाम प्रदान कर रहा है, और इसी तरह। मैं उसे कैसे प्राप्त कर सकता हूं? मुझे उपयोगकर्ता के पंजीकरण से जो भी उपलब्ध हो, जानकारी का उपयोग करके भरने के लिए ग्राहक प्रपत्र की आवश्यकता है। समझ में आता है? या मैं जो कार्यान्वयन करने की कोशिश कर रहा हूं वह गलत है। पहले ही, आपका बहुत धन्यवाद। कृपया Model.py और views.py के लिए कोड नीचे देखें

Model.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.contrib.auth.models import Group

# Create your models here.

class Customer(models.Model):
    user = models.OneToOneField(User, null=True, blank=True,on_delete=models.CASCADE)
    name = models.CharField(max_length=200, null=True)
    last_name = models.CharField(max_length=200, null=True, blank=True)
    phone = models.CharField(max_length=200, null=True)
    email = models.CharField(max_length=200, null=True)
    city = models.CharField(max_length=200, null=True)
    address_1 = models.CharField(max_length=200, null=True)
    zip_code = models.CharField(max_length=5, null=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)

    def __str__(self):
        return str(self.name)
        #return self.name



# Using signals to post_save data

def customer_profile(sender, instance, created, **kwargs):
    if created:
        group = Group.objects.get(name='customer')
        instance.groups.add(group)
        Customer.objects.create(
            user=instance,
            name=instance.username,
            )
        print('Profile created!')

post_save.connect(customer_profile, sender=User)
    

View.py

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
#from django.urls import reverse_lazy
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import Group
from django.contrib import messages
from django.contrib.auth.decorators import login_required # in order to restrict views, login decorators

# Create your views here.
from .models import *
from .forms import CreateUserForm, EditProfileForm, CustomerForm
from .decorators import unauthenticated_user, allowed_users, admin_only
def home(request):
    return render(request,'first_app/home.html')
def books(request):
    return render(request,'first_app/books.html')

@unauthenticated_user
def registerPage(request):

    form = CreateUserForm()
    if request.method == 'POST':
        form = CreateUserForm (request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')

            #group = Group.objects.get(name ='customer') # replaced with signals on models.py
            #user.groups.add(group)
            #Customer.objects.create(
            #user=user,
            #name=user.username,
            #)

            messages.success(request,'Hello ' + username + ' Your account has been created')
            return redirect('login')

    context = {'form':form}
    return render(request,'first_app/register.html', context)

@unauthenticated_user
def loginPage(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            return redirect('profile')
        else:
            messages.info(request, 'Username or Password is Incorrect')
            messages.info(request, 'Please Try Again')
    context = {}
    return render(request,'first_app/login.html', context)

def logoutUser(request):
    logout(request)
    return redirect('login')

@login_required(login_url='login') # in order to restrict views, login decorators
def profile(request):
    #contex = {}
    return render(request,'first_app/profile.html')

def base(request):
    #contex = {}
    return render(request,'first_app/base.html')

@login_required(login_url='login') # in order to restrict views, login decorators
def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect('profile')
    else:
        form = EditProfileForm(instance=request.user)
        args = {'form': form}
        return render(request, 'first_app/edit_profile.html', args)

def userPage(request):
    context = {}
    return render(request, 'first_app/user.html', context)


@login_required(login_url='login') # in order to restrict views, login decorators
def customer(request):
    #customers = Customer.objects.all()
    #context = {'customers':customers} # dictionary to passing the data below

    customer = request.user.customer # using customer instance
    form = CustomerForm(instance=customer) # using customer instance
    #user = request.user
    #form = CustomerForm(instance=user)


    if request.method == 'POST':
        form = CustomerForm(request.POST, instance=customer) # using customer instance
        #form = CustomerForm(request.POST, instance=user)
        if form.is_valid():
            form.save()


    context = {'form':form}

    return render(request, 'first_app/customer.html', context)

Form.py

from django.forms import ModelForm
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User
from django import forms

from .models import *

class CreateUserForm(UserCreationForm):
    #fullname = forms.CharField(label="First name")
    class Meta:
        model = User
        fields = ['first_name','last_name','username', 'email', 'password1', 'password2'] #Python list

class EditProfileForm(UserChangeForm):
    #fullname = forms.CharField(label="First name")
    class Meta:
        model = User
        fields = ['first_name','last_name','username', 'email'] #Python list

class CustomerForm(ModelForm):
    class Meta:
        model = Customer
        fields = '__all__'
        exclude = ['user']
1
Nick_Nick 31 जिंदा 2021, 19:37

2 जवाब

सबसे बढ़िया उत्तर

लंबी पोस्ट के लिए क्षमा करें..

मैंने django से एक अंतर्निहित समाधान की तलाश करने की कोशिश की लेकिन मुझे एक नहीं मिला।

सबसे आसान बात जो मैं सोच सकता था, वह थी फॉर्म में सिर्फ दो मॉडल।

इसके लिए उपयोगकर्ता मॉडल में पहले से मौजूद Customer मॉडल से कुछ फ़ील्ड निकालने की आवश्यकता है। मैंने customer_profile post_save सिग्नल का भी उपयोग नहीं किया। इसलिए इन सुझावों का इसके साथ परीक्षण नहीं किया जाता है जब तक कि यह उन परिवर्तनों के साथ पूरी तरह से बेमानी न हो जो ऐसा हो सकता है।

models.py में संशोधित

class Customer(models.Model):
    user = models.OneToOneField(User, blank=True,on_delete=models.CASCADE)
    phone = models.CharField(max_length=200, null=True)
    city = models.CharField(max_length=200, null=True)
    address_1 = models.CharField(max_length=200, null=True)
    zip_code = models.CharField(max_length=5, null=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)


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

फिर निश्चित रूप से माइग्रेशन चलाने के लिए एक रिमाइंडर

python manage.py makemigrations first_app
python manage.py migrate

यदि वे विफल हो जाते हैं तो माइग्रेशन फ़ोल्डर और डेटाबेस फ़ाइल को हटा दें और फिर से चलाएं (यह मानते हुए कि डेटाबेस में कोई डेटा रखने योग्य नहीं है)।

यदि आप उपयोगकर्ता के डेटा को उनके सामने प्रस्तुत करना चाहते हैं, लेकिन उन्हें संपादित करने में सक्षम नहीं हैं, तो आपको निम्न तरीके से एक मॉडल फॉर्म जोड़ने की आवश्यकता है।

forms.py में जोड़ा गया

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = [
            'username',
            'first_name',
            'last_name',
            'email'
        ]
        widgets = {
            'username': forms.TextInput(attrs={'readonly': True }),
            'first_name': forms.TextInput(attrs={'readonly': True }),
            'last_name': forms.TextInput(attrs={'readonly': True }),
            'email': forms.TextInput(attrs={'readonly': True }),
        }
        help_texts = {
            'username': ''
        }

फ़ील्ड केवल पढ़ने के लिए सेट हैं और अक्षम नहीं हैं क्योंकि अन्यथा उन्हें फ़ॉर्म के साथ सबमिट नहीं किया जाएगा। कष्टप्रद सहायता पाठ username फ़ील्ड के लिए भी अक्षम है।

तब आपका customer दृश्य इस तरह दिख सकता है

views.py

# add these imports
from django.contrib.auth.models import User
# add UserForm
from .forms import CreateUserForm, EditProfileForm, CustomerForm, UserForm

@login_required(login_url='login') # in order to restrict views, login decorators
def customer(request):

    user = request.user

    if request.method == 'POST':

        # create customer
        customer_form = CustomerForm(request.POST)

        # check if customer already exists
        # this allows customer details to be edited
        # also stops unique key error if creating a customer for a user that already has a customer object
        try:
            customer = Customer.objects.get(user=user)
            customer_form = CustomerForm(request.POST, instance=customer)
        except Customer.DoesNotExist:
            customer_form = CustomerForm(request.POST)

        if customer_form.is_valid():
            customer = customer_form.save(commit=False)
            customer.user = user
            customer.save()

        # returning HttpResponse else you will reload the same page
        return HttpResponse("Successfully saved Customer")
        
    user_form = UserForm(instance=user)

    customer_form = CustomerForm()

    context = {
        'user_form': user_form,
        'customer_form': customer_form 
        }

    return render(request, 'first_app/customer.html', context)


मुझे नहीं पता कि आपका customer.html पेज कैसा दिखता है, लेकिन निम्नलिखित एचटीएमएल संबंधित आउटपुट देगा।

customer.html

<h1>Customer Page</h1>

<form action="/customer" method="POST">
    {% csrf_token %}

    {{ user_form.as_p }}

    {{ customer_form.as_p }}

    <input type="submit" value="Create Customer"></input>
</form>

उपयोगकर्ता तालिका में परीक्षण उपयोगकर्ता test user in db

पूर्व-आबादी प्रासंगिक क्षेत्रों के साथ प्रस्तुत प्रपत्र।

rendered form with all fields

परिणामी Customer डेटाबेस में ऑब्जेक्ट

Customer object in db

यदि आप चाहते हैं कि ग्राहक अपने उपयोगकर्ता डेटा को संपादित कर सके तो Customer मॉडल को बदलने के बाद निम्न कार्य करें।

Form.py . में जोड़ा गया

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = [
            'username',
            'first_name',
            'last_name',
            'email'
        ]

View.py

@login_required(login_url='login') # in order to restrict views, login decorators
def customer(request):

    user = request.user

    if request.method == 'POST':

        # update user
        user_form = UserForm(request.POST, instance=user)
        if user_form.is_valid():
            user_form.save()

        # safety check if customer already exists
        # this allows customer details to be edited
        # also stops unique key error if creating a customer for a user that already has a customer object
        try:
            customer = Customer.objects.get(user=user)
            customer_form = CustomerForm(request.POST, instance=customer)
        except Customer.DoesNotExist:
            customer_form = CustomerForm(request.POST)

        # create customer
        customer_form = CustomerForm(request.POST)
        if customer_form.is_valid():
            customer = customer_form.save(commit=False)
            customer.user = user
            customer.save()



        # returning HttpResponse else you will reload the same page
        return HttpResponse("Successfully saved Customer")
        
    user_form = UserForm(instance=user)

    customer_form = CustomerForm()

    context = {
        'user_form': user_form,
        'customer_form': customer_form 
        }

    return render(request, 'first_app/customer.html', context)

Customer.html (पिछले उदाहरण के समान)

<h1>Customer Page</h1>

<form action="/customer" method="POST">
    {% csrf_token %}

    {{ user_form.as_p }}

    {{ customer_form.as_p }}

    <input type="submit" value="Create Customer"></input>
</form>

प्रपत्र में उपयोगकर्ता विवरण का उदाहरण अद्यतन

rendered form with edited user details

डेटाबेस में अद्यतन उपयोगकर्ता updated user

2
Danoram 2 फरवरी 2021, 08:23

इस तरह सोचो।

Django डिफ़ॉल्ट User मॉडल में है:

['first_name','last_name','username', 'email', 'password1', 'password2']

आपको उन्हें फिर से Customer मॉडल में स्टोर करने की आवश्यकता नहीं है, इसके बजाय आप उन्हें अपडेट कर सकते हैं।

Customer मॉडल में इन नीचे के क्षेत्रों को हटा दें:

['name','last_name', 'email']

तो आपका Customer मॉडल इस प्रकार होगा:

class Customer(models.Model):
    user = models.OneToOneField(User, null=True, blank=True,on_delete=models.CASCADE)
    phone = models.CharField(max_length=200, null=True)
    city = models.CharField(max_length=200, null=True)
    address_1 = models.CharField(max_length=200, null=True)
    zip_code = models.CharField(max_length=5, null=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)

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

तब आपका customer_profile संकेत इस प्रकार होगा:

def customer_profile(sender, instance, created, **kwargs):
    if created:
        group = Group.objects.get(name='customer')
        instance.groups.add(group)
        Customer.objects.create(
            user=instance,
            )
        print('Profile created!')

post_save.connect(customer_profile, sender=User)

अब आपके पास दो पेज हैं। मूल्यों को अद्यतन करने के लिए एक edit profile पृष्ठ के लिए है:

['first_name','last_name','username', 'email']

अन्य Customer मॉडल फ़ील्ड भरने के लिए है:

['phone','city','address_1', 'zip_code']
0
Siva Sankar 31 जिंदा 2021, 23:52