python - reverse_lazy - forms class django
Cómo establecer ForeignKey en CreateView? (4)
Acabo de tropezar con este problema y este hilo me condujo en la dirección correcta (¡gracias!). En base a esta página de documentación de Django , podemos evitar llamar al método save()
del formulario:
class CreateArticle(LoginRequiredMixin, CreateView):
model = Article
def form_valid(self, form):
form.instance.author = self.request.user
return super(CreateArticle, self).form_valid(form)
Tengo un modelo:
class Article(models.Model):
text = models.CharField()
author = models.ForeignKey(User)
¿Cómo escribo la vista basada en clases que crea una nueva instancia de modelo y establece la clave externa del author
para request.user
?
Debe configurar un CreateView
usando un ModelForm
para ese modelo. En la definición de formulario, establece ForeignKey
para que tenga el widget HiddenInput
y luego utiliza el método get_form
en la vista para establecer el valor de su usuario:
forms.py:
from django import forms
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
widgets = {"user": forms.HiddenInput()}
views.py:
from django.views.generic import *
from myapp.forms import ArticleForm
from myapp.models import Article
class NewArticleView(CreateView):
model = Article
form_class = ArticleForm
def get_form(self, form_class):
initials = {
"user": self.request.user
}
form = form_class(initial=initials)
return form
El código de Berislav en views.py no funciona para mí. El formulario se representa como se espera, con el valor del usuario en una entrada oculta, pero el formulario no se guarda (no sé por qué). He intentado un enfoque ligeramente diferente, que funciona para mí:
views.py
from django.views.generic import *
from myapp.forms import ArticleForm
from myapp.models import Article
class NewArticleView(CreateView):
model = Article
form_class = ArticleForm
def get_initial(self):
return {
"user": self.request.user
}
Lo resolví anulando el método form_valid
. Aquí está el estilo detallado para aclarar cosas:
class CreateArticle(CreateView):
model = Article
def form_valid(self, form):
article = form.save(commit=False)
article.author = self.request.user
#article.save() # This is redundant, see comments.
return super(CreateArticle, self).form_valid(form)
Sin embargo, podemos hacerlo breve (gracias dowjones123), este caso se menciona en los documentos .
class CreateArticle(CreateView):
model = Article
def form_valid(self, form):
form.instance.author = self.request.user
return super(CreateArticle, self).form_valid(form)