Как отобразить 3-х зависимое раскрывающееся меню в форме Django - PullRequest
0 голосов
/ 17 июня 2019

Я использую 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")

В результате я хочу создать три зависимых раскрывающихся списка. Я потратил много времени на решение этой проблемы. Вы можете мне помочь?

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