Как создать встроенный набор форм для обратной связи по внешнему ключу

У меня есть модель собственности следующим образом =

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
Другие вопросы по тегам