Как создать встроенный набор форм для обратной связи по внешнему ключу
У меня есть модель собственности следующим образом =
class Property(models.Model):
property_type = models.CharField(max_length=255, default='Apartment')
specifications = models.CharField(max_length=255, default='Basic')
built_up_area = models.FloatField(max_length=6, null=False, default=0)
total_area = models.FloatField(null=False, default=0)
number_of_bedrooms = models.CharField(max_length=3, default=1)
number_of_bathrooms = models.CharField(max_length=3, default=1)
number_of_parking_spaces = models.CharField(max_length=2, default=0)
address_line_one = models.CharField(max_length=255, null=False)
address_line_two = models.CharField(max_length=255, null=True, default=None)
connectivity = models.CharField(max_length=255, default=None, null=True)
neighborhood_quality = models.CharField(max_length=255, default=None,
null=True)
comments = models.CharField(max_length=255, default=None, null=True)
city = models.ForeignKey('City')
state = models.ForeignKey('State')
pin_code = models.ForeignKey('PinCode')
developer = models.ForeignKey('Developer', null=True, default=None)
owner = models.ForeignKey('Owner', null=True, default=None)
created_by = models.ForeignKey('custom_user.User')
project = models.ForeignKey('Project')
def __unicode__(self):
return self.property_type
class Meta:
verbose_name_plural = 'Properties'
И модель города выглядит следующим образом -
class City(models.Model):
name = models.CharField(max_length=255)
slug = models.SlugField(unique=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(City, self).save(*args, **kwargs)
def __unicode__(self):
return self.name
Теперь я хочу создать единую форму, в которой я могу ввести информацию о свойстве, и при вводе города я могу ввести название города, а не выбирать из выпадающего списка.
Итак, как мне создать встроенный набор форм, используя inlineformset_factory для создания формы?
== EDIT ==
Я пытался использовать следующий код для создания формы
CityFormset = inlineformset_factory(City, Property,
fields=('city',),
extra=0,
min_num=1,
can_delete=False)
1 ответ
Вы неправильно поняли, что такое встроенный набор форм. Он предназначен для редактирования стороны "многие" отношения "один ко многим": то есть, учитывая родительскую модель City, вы можете редактировать встроенные свойства, принадлежащие этому городу.
Вы вообще не хотите, чтобы набор форм просто редактировал один Город, которому может принадлежать свойство. Вместо этого переопределите city
поле в вашей форме собственности, чтобы быть TextField, и либо создать новый город или найти существующий в clean_city
метод.
class PropertyForm(forms.ModelForm):
city = forms.TextField(required=True)
class Meta:
model = Property
exclude = ('city',)
def __init__(self, *args, **kwargs):
super(PropertyForm, self).__init__(*args, **kwargs)
if self.instance and not self.data:
self.initial['city'] = self.instance.city.name
def save(self, commit=True):
city_name = self.cleaned_data['city']
city, _ = City.objects.get_or_create(name=city_name)
instance = self.save(commit=False)
instance.city = city
if commit = True:
instance.save()
return instance