En una vista de clase UpdateView en Django, excluyo el campo de usuario ya que es interno al sistema y no lo pediré. Ahora, ¿cuál es la forma correcta de Django de pasar al usuario al formulario? (Cómo lo hago ahora, si paso al usuario al init del formulario y luego anulo el método save() del formulario, pero apuesto a que hay una forma adecuada de hacerlo. Algo así como un campo oculto o . cosas de esa naturalezavista basada en clase de django - UpdateView - ¿Cómo acceder al usuario de solicitud mientras se procesa un formulario?
# models.py
class Entry(models.Model):
user = models.ForeignKey(
User,
related_name="%(class)s",
null=False
)
name = models.CharField(
blank=False,
max_length=58,
)
is_active = models.BooleanField(default=False)
class Meta:
ordering = ['name',]
def __unicode__(self):
return u'%s' % self.name
# forms.py
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
exclude = ('user',)
# views.py
class UpdateEntry(UpdateView):
model = Entry
form_class = EntryForm
template_name = "entry/entry_update.html"
success_url = reverse_lazy('entry_update')
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(UpdateEntry, self).dispatch(*args, **kwargs)
# urls.py
url(r'^entry/edit/(?P<pk>\d+)/$',
UpdateEntry.as_view(),
name='entry_update'
),
recomiendo la eliminación de las dos últimas líneas ('.save()' y 'return') y su sustitución por' super (MyUpdateView, auto) .form_valid (forma) '. Esto simplemente ejecutará el valor predeterminado form_valid() (idéntico a sus dos últimas líneas) en su instancia de formulario modificado, manteniendo su código sincronizado con cualquier cambio futuro que el proyecto Django realice en este método. – Bryson
@Bryson, ¡agradable! De hecho, nunca he hecho eso antes. Supongo que no es inmediatamente intuitivo que la instancia esté referenciada en form.instance y, por lo tanto, la modificación afecta de nuevo a la llamada save() futura. –
Algo que olvidé: en vez de usar 'instance =' creo que deberías estar usando 'form.instance ='. Esto agregará al usuario desde el objeto de solicitud (suponiendo que su formulario se haya realizado con este campo, de lo contrario se producirá un error como "El formulario no tiene ningún atributo 'usuario'") a la instancia del formulario, que luego se volverá a pasar por ' super() '. Como está escrito, escriba ahora, la forma modificada con los datos del usuario se guarda en una variable llamada 'instancia' que nunca deja su versión de' form_valid', por lo que debido a que cambió a 'super()' nunca se guarda. Lo siento, se puso complicado. jaja – Bryson