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)