मैंने उपयोगकर्ता मॉडल को बढ़ाया और उपयोगकर्ताओं से ग्राहक मॉडल में एक से एक संबंध बनाया। हालांकि, जब भी मैं ग्राहक पृष्ठ को कॉल कर रहा हूं तो उपयोगकर्ता मॉडल के फ़ील्ड वहां प्रस्तुत नहीं किए जाते हैं। यह पहले नाम को नाम, अंतिम नाम और ईमेल पते के रूप में प्रस्तुत करने के बजाय केवल एक फ़ील्ड, फ़ील्ड नाम में ग्राहक मॉडल में उपयोगकर्ता नाम प्रदान कर रहा है, और इसी तरह। मैं उसे कैसे प्राप्त कर सकता हूं? मुझे उपयोगकर्ता के पंजीकरण से जो भी उपलब्ध हो, जानकारी का उपयोग करके भरने के लिए ग्राहक प्रपत्र की आवश्यकता है। समझ में आता है? या मैं जो कार्यान्वयन करने की कोशिश कर रहा हूं वह गलत है। पहले ही, आपका बहुत धन्यवाद। कृपया 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']
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>
उपयोगकर्ता तालिका में परीक्षण उपयोगकर्ता
पूर्व-आबादी प्रासंगिक क्षेत्रों के साथ प्रस्तुत प्रपत्र।
परिणामी Customer
डेटाबेस में ऑब्जेक्ट
यदि आप चाहते हैं कि ग्राहक अपने उपयोगकर्ता डेटा को संपादित कर सके तो 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>
प्रपत्र में उपयोगकर्ता विवरण का उदाहरण अद्यतन
इस तरह सोचो।
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']
संबंधित सवाल
नए सवाल
django
Django एक ओपन-सोर्स सर्वर-साइड वेब एप्लीकेशन फ्रेमवर्क है जिसे पायथन में लिखा गया है। यह कम कोड, विशेष-अतिरेक पर विशेष ध्यान देने और निहित से अधिक स्पष्ट होने के साथ जटिल डेटा-संचालित वेबसाइटों और वेब एप्लिकेशन बनाने के लिए आवश्यक प्रयास को कम करने के लिए डिज़ाइन किया गया है।