Advertisement
Guest User

Untitled

a guest
Nov 27th, 2016
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.29 KB | None | 0 0
  1. # forms.py
  2. class ProfileForm(forms.ModelForm):
  3.  
  4.     city = forms.ModelChoiceField(queryset=None)
  5.  
  6.     def __init__(self, *args, **kwargs):
  7.         if 'region' in kwargs:
  8.             # добавление городов только из указанного региона
  9.             region = kwargs.pop('region')
  10.             super(ProfileForm, self).__init__(*args, **kwargs)
  11.             self.fields['city'].queryset = region.city_set.all()
  12.         elif 'data' in kwargs:
  13.             # при создании bound form нужно взять регион из данных
  14.             # если оставить queryset пустым, то форма не будет валидна
  15.             # к тому же, форма не должна терять данные юзера между сабмитами
  16.             super(ProfileForm, self).__init__(*args, **kwargs)
  17.             region_id = self['region'].value()
  18.             region = Region.objects.get(pk=region_id)
  19.             self.fields['city'].queryset = region.city_set.all()
  20.  
  21.     class Meta:
  22.         model = Profile
  23.         fields = ['country', 'region']
  24.  
  25.  
  26. # views.py
  27. def signup(request):
  28.     if request.method == 'POST':
  29.         pform = ProfileForm(data=request.POST)
  30.         if pform.is_valid():
  31.             return HttpResponse('%s' % pform)
  32.     else:
  33.         # определение гео пришедшего юзера
  34.         ip = request.META.get('REMOTE_ADDR', '') or request.META.get(
  35.                'HTTP_X_FORWARDED_FOR', '')
  36.         info = get_ip_info(ip)
  37.         region = Region.objects.filter(name__contains=info['region'])[0]
  38.         city = City.objects.filter(name__contains=info['city'])[0]
  39.  
  40.         pform = ProfileForm(region=region,
  41.                             initial={'region': region.id, 'city': city.id,
  42.                                     'country': 1
  43.                                     })
  44.     return render(request, 'authenticate/signup.html', {
  45.         'pform': pform,
  46.         'message': message,
  47.     })
  48.  
  49. # тут все стандартно
  50. # models.py
  51. class Country(models.Model):
  52.     id = models.IntegerField(primary_key=True)
  53.     name = models.CharField(max_length=100)
  54.     rank = models.IntegerField(default=0)
  55.  
  56.     def __str__(self):
  57.         return '{}'.format(self.name)
  58.  
  59.  
  60. class Region(models.Model):
  61.     id = models.IntegerField(primary_key=True)
  62.     name = models.CharField(max_length=100)
  63.     country = models.ForeignKey(Country, on_delete=models.CASCADE, default=0)
  64.     rank = models.IntegerField(default=0)
  65.  
  66.     def __str__(self):
  67.         return '{}'.format(self.name)
  68.  
  69. class City(models.Model):
  70.     id = models.IntegerField(primary_key=True)
  71.     region = models.ForeignKey(Region, on_delete=models.CASCADE)
  72.     name = models.CharField(max_length=100)
  73.     center = models.BooleanField(default=False)
  74.     rank = models.IntegerField(default=0)
  75.  
  76.     def __str__(self):
  77.         return '{}'.format(self.name)
  78.  
  79. class Profile(models.Model):
  80.     id = models.IntegerField(primary_key=True)
  81.     user = models.ForeignKey(settings.AUTH_USER_MODEL,
  82.                             on_delete=models.CASCADE)
  83.     country = models.ForeignKey(Country, on_delete=models.CASCADE)
  84.     region = models.ForeignKey(Region, on_delete=models.CASCADE)
  85.     city = models.ForeignKey(City, on_delete=models.CASCADE)
  86.     bday = models.DateField()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement