form example dynamically django django-models django-forms inline-formset

dynamically - formset django example



Cómo crear un formset en línea para una relación inversa de clave externa (1)

Has entendido mal qué es un formset en línea. Es para editar el lado "muchos" de una relación de uno a varios: es decir, dado un modelo principal de Ciudad, podría editar en línea las diversas Propiedades que pertenecen a esa ciudad.

No desea que un formset simplemente edite la única ciudad a la que puede pertenecer una propiedad. En su lugar, anule el campo de la city dentro de su formulario de Propiedad para que sea un clean_city , y cree una Ciudad nueva o encuentre una existente en el método 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

Tengo un Modelo de Propiedad de la siguiente manera =

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''

Y un modelo de ciudad de la siguiente manera:

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

Ahora quiero hacer un único formulario donde pueda ingresar los detalles de la Propiedad y al ingresar a la ciudad, puedo ingresar el nombre de la ciudad en lugar de seleccionarla en la lista desplegable.

Entonces, ¿cómo creo el formset en línea usando inlineformset_factory para crear el formulario?

== EDITAR ==

Intenté usar el siguiente código para crear el formset

CityFormset = inlineformset_factory(City, Property, fields=(''city'',), extra=0, min_num=1, can_delete=False)