Я использую Django 2.2. При регистрации в моем проекте я хотел бы видеть выпадающий список провинций, районов и районов, необходимых для адреса пользователя. Другими словами, после выбора провинций и районов, выбранных после выбора провинции, перечисляются выбранные районы.
models.py
from django.db import models
from django.contrib.auth.models import User
from django.contrib import admin
from .choices import *
class Province(models.Model):
name_province = models.CharField(max_length=50, default=1,
verbose_name="Province")
def __str__(self):
return self.name_province
class District(models.Model):
province = models.ForeignKey(Province, on_delete=models.CASCADE,
blank=True, null=True)
name_district = models.CharField(max_length=50, default=1,
verbose_name="District")
def __str__(self):
return self.name_district
class Neighborhood(models.Model):
district = models.ForeignKey(District, on_delete=models.CASCADE,
blank=True, null=True)
name_neighborhood = models.CharField(max_length=50, default=1,
verbose_name="Neighborhood")
def __str__(self):
return self.name_neighborhood
class StoreOtherInfo(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,blank=True,
null=True)
phone = models.CharField(max_length=11,verbose_name="Phone_Number")
fax = models.CharField(max_length=11,verbose_name="Fax")
province = models.ForeignKey(Province, on_delete=models.SET_NULL,
null=True)
district = models.ForeignKey(District, on_delete=models.SET_NULL,
null=True)
neighborhood = models.ForeignKey(Neighborhood,
on_delete=models.SET_NULL, null=True)
avenue = models.CharField(max_length=50,verbose_name="Avenue")
street = models.CharField(max_length=50,verbose_name="Street")
block = models.CharField(max_length=80,verbose_name="Block")
number = models.CharField(max_length=11,verbose_name="Number")
storey = models.CharField(max_length=11,verbose_name="Storey")
profile_image = models.FileField(blank = True,null =
True,verbose_name="Add Photos")
def __str__(self):
return self.user.username
class Meta:
verbose_name_plural = 'Other Informations'
views.py
def register(request):
form = RegisterForm(request.POST or None,request.FILES or None )
if form.is_valid():
user = form.save(commit=False)
first_name = form.cleaned_data.get("first_name")
last_name = form.cleaned_data.get("last_name")
username = form.cleaned_data.get("username")
email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password1')
phone = form.cleaned_data.get('phone_number')
fax = form.cleaned_data.get('fax')
province = form.cleaned_data.get('province')
district = form.cleaned_data.get('district')
neighborhood = form.cleaned_data.get('neighborhood')
profile_image = form.cleaned_data.get('profile_image')
avenue = form.cleaned_data.get('avenue')
street = form.cleaned_data.get('street')
block = form.cleaned_data.get('block')
number = form.cleaned_data.get('number')
storey = form.cleaned_data.get('storey')
user.set_password(password)
new_user = authenticate(username=user.username,
first_name=first_name, last_name=last_name, email=email,
password=password)
StoreOtherInfo.objects.create(user=new_user, phone=phone, fax=fax,
province=province, district=district, neighborhood=neighborhood,
avenue=avenue, street=street, block=block, number=number, storey=storey,
profile_image=profile_image)
user.save()
login(request,new_user)
messages.info(request,"You have successfully registered...")
return redirect("/store/profile/")
context = {
"form" : form
}
return render(request,"store/register.html",context)
register.html
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.first_name|as_crispy_field }}
{{ form.last_name|as_crispy_field }}
{{ form.email|as_crispy_field }}
{{ form.username|as_crispy_field }}
{{ form.password1|as_crispy_field }}
{{ form.password2|as_crispy_field }}
{{ form.phone_number|as_crispy_field }}
{{ form.fax|as_crispy_field }}
{{ form.profile_image|as_crispy_field }}
<label for="">Country</label>
<input class="form-control" type="text" placeholder="Turkey" readonly>
{{ form.province|as_crispy_field }}
{{ form.district|as_crispy_field }}
{{ form.neighborhood|as_crispy_field }}
{{ form.avenue|as_crispy_field }}
{{ form.street|as_crispy_field }}
{{ form.block|as_crispy_field }}
{{ form.number|as_crispy_field }}
{{ form.storey|as_crispy_field }}
<div class="form-group">
<h4 class="text-center">
<button type="submit" class="btn btn-block btn-outline-primary">
Register
</button>
</h4>
</div>
</form>
forms.py
from django import forms
from django.contrib.auth.models import User
from .models import StoreOtherInfo,Province,District,Neighborhood
from .choices import *
class RegisterForm(forms.ModelForm):
email = forms.EmailField()
password1 = forms.CharField(max_length=100,
label='Parola',widget=forms.PasswordInput())
password2 = forms.CharField(max_length=100, label='Parola Confirm',
widget=forms.PasswordInput())
phone_number = forms.CharField(required=False, max_length=11,
label='Phone Number')
fax = forms.CharField(required=False, max_length=11, label='Fax')
province = forms.ChoiceField(required=False, choices=PROVINCE_CHOICES,
label='Province')
district = forms.ChoiceField(required=False, choices=DISTRICT_CHOICES,
label='District')
neighborhood = forms.ChoiceField(required=False,
choices=NEIGHBORHOOD_CHOICES, label='Neighborhood')
avenue = forms.CharField(required=False, max_length=50,
label='Avenue')
street = forms.CharField(required=False, max_length=50,
label='Street')
block = forms.CharField(required=False, max_length=50, label='Block')
number = forms.CharField(required=False, max_length=11,
label="Number")
storey = forms.CharField(required=False, max_length=11,
label="Storey")
profile_image = forms.FileField(required=False, label="Add Photos")
В результате я хочу создать три зависимых раскрывающихся списка. Я потратил много времени на решение этой проблемы. Вы можете мне помочь?