es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django – ¿Cómo establezco un valor predeterminado en un formulario para que sea el usuario actual?

Pregunta rápida de Django para principiantes, porque no he podido encontrar una respuesta que resuelva directamente lo que estoy buscando, o no agregue una funcionalidad demasiado complicada que no necesito con su respuesta.

Tengo una configuración básica de un blog, con un modelo para usuarios y sus publicaciones asociadas, y un formulario para crear nuevas publicaciones. Sin embargo, lo único que quiero es que el campo “Autor” en el formulario se rellene automáticamente con el usuario que ha iniciado sesión actualmente, en lugar de ser una lista desplegable de todos los usuarios registrados.
Mi modelo:

class Post(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(User, on_delete=models.CASCADE)
body = models.TextField()
post_date = models.DateField(auto_now_add=True)
category = models.CharField(max_length=255)
site = models.CharField(max_length=255)
def str(self):
return self.title + ‘ | ‘ + str(self.author)
def get_absolute_url(self):
return reverse(‘home’)

Mi formulario:

class PostForm(forms.ModelForm):
class Meta:
model=Post
fields = (‘title’, ‘author’, ‘category’, ‘site’, ‘body’)
widgets = {
‘title’: forms.TextInput(attrs={‘class’: ‘form-control’}),
‘author’: forms.Select(attrs={‘class’: ‘form-control’ ,’readonly’: ‘readonly’}),
‘category’: forms.Select(choices=choice_list,attrs={‘class’: ‘form-control’}),
‘site’: forms.Select(choices=site_choice_list,attrs={‘class’: ‘form-control’}),
‘body’: forms.Textarea(attrs={‘class’: ‘form-control’})
}

Mi vista:

class AddPostView(CreateView):
model = Post
form_class = PostForm
template_name = ‘add_post.html’

Para reiterar, simplemente quiero que el campo ‘author’ en la publicación sea de solo lectura y se rellene con el usuario actualmente autenticado. En lugar de que el usuario pueda seleccionar de una lista de usuarios.

Gracias de antemano, déjeme saber si puedo proporcionar algo más para ayudarlo a ayudarme 🙂

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para llenar automáticamente el campo “Autor” con el usuario actualmente conectado, debes hacer algunos cambios en tu código de vista y formulario en Django.

    En primer lugar, en tu vista, debes sobrescribir el método form_valid y establecer el valor del campo autor en el usuario actualmente conectado. Aquí te mostramos cómo puedes actualizar tu vista AddPostView:

    class AddPostView(CreateView):
    model = Post
    form_class = PostForm
    template_name = ‘add_post.html’

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)
    

    En el método form_valid, estamos estableciendo el campo autor en el usuario actualmente conectado, al cual se puede acceder mediante self.request.user.

    En segundo lugar, debes actualizar tu clase PostForm para que el campo autor sea de solo lectura y se oculte del formulario. Puedes hacer esto utilizando un widget de entrada oculta y estableciendo el valor inicial en el usuario actualmente conectado. Aquí tienes el PostForm actualizado:

    class PostForm(forms.ModelForm):
    author = forms.CharField(widget=forms.HiddenInput(), initial=”)

    class Meta:
        model = Post
        fields = ('title', 'category', 'site', 'body')
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'category': forms.Select(choices=choice_list, attrs={'class': 'form-control'}),
            'site': forms.Select(choices=site_choice_list, attrs={'class': 'form-control'}),
            'body': forms.Textarea(attrs={'class': 'form-control'})
        }
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['author'].initial = self.instance.author.username
        self.fields['author'].widget.attrs['readonly'] = True
    

    En la clase PostForm, estamos agregando un widget de entrada oculta para el campo autor y estableciendo el valor inicial en una cadena vacía. También estamos estableciendo el campo en solo lectura y ocultándolo del formulario mediante los atributos del widget. En el método init, estamos estableciendo el valor inicial del campo autor en el nombre de usuario del usuario actualmente conectado.

    Con estos cambios, el campo “Autor” debería llenarse automáticamente con el usuario actualmente conectado al crear una nueva publicación.

Comments are closed.