python - por - Django CreateView personaliza el campo predeterminado del formulario en función del parámetro url
post django (1)
archivo: Capacity / models.py
class Env(models.Model):
name = models.CharField(max_length=50)
def get_absolute_url(self):
return reverse(''index'')
class Envhosts(models.Model):
env = models.ForeignKey(Env)
hostname = models.CharField(max_length=50)
count = models.IntegerField()
class Meta:
unique_together = ("env","hostname")
def get_absolute_url(self):
return reverse(''index'')
archivo: Capacity / views.py
class EnvhostsCreate(CreateView):
model = Capacity.models.Envhosts
fields=[''env'',''hostname'',''count'']
template_name_suffix = ''_create_form''
archivo Capacity / urls.py:
urlpatterns = patterns(........ url(r''^createhosts/(?P<envid>/d+)/$'',EnvhostsCreate.as_view(),name=''envhosts_create''))
Así que ahora, cuando abro este formulario: /Capacity/createhosts/3/
(donde 3 es mi env id) Muestra una opción de objetos env como una lista desplegable basada en el número de objetos de Env. Pero quiero que tome el env por sí mismo basado en el env id (''3'' en este caso)
Sé que tengo que anular algún método en la clase EnvhostsCreate (CreateView). Pero soy incapaz de averiguar qué método y cómo tomar el env basado en la parte posterior /createhosts/
Puede usar el patrón descrito en la documentación para agregar request.user: es el mismo principio. Elimine env
de la lista de campos, luego defina form_valid()
:
class EnvhostsCreate(CreateView):
model = Capacity.models.Envhosts
fields = [''hostname'', ''count'']
template_name_suffix = ''_create_form''
def form_valid(self, form):
form.instance.env = Envhosts.objects.get(pk=self.kwargs[''envid''])
return super(EnvhostsCreate, self).form_valid(form)