success_url reverse_lazy createview create based ajaxableresponsemixin python django django-class-based-views

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)