Quiero poder usar request.user en el formulario de modelo init. Aquí está mi vista:
def create(request, pk): if request.method == 'POST': form = CreateForm(request.POST) if form.is_valid(): object = form.save() object.save() return render(request, 'going_create.html', {'object':object}) else: form = CreateForm() return render(request, 'being_create.html', {'form':form})Básicamente, necesito request.user para completar previamente un campo de formulario de django. Aquí está mi formulario:
class CreateForm(forms.ModelForm): def __init__(self, *args, **kwargs): self.request = kwargs.pop('request') super(CreateForm, self).__init__(*args, **kwargs) self.fields['first_name'].initial = self.request.user.first_name class Meta: model = creater fields = ( 'first_name', ) Además, hay form = CreateForm(request.POST) if request.method == 'POST', y form = CreateForm() cuando más. Entonces, como no estoy familiarizado con el uso de una vista de función, espero que me diga dónde necesito agregar el código para poder usar request.user para completar un campo de django. Gracias, y por favor deje cualquier pregunta que tenga.
Lo pasas a través de un parámetro:
class CreateForm(forms.ModelForm): def __init__(self, *args , user=None , **kwargs): super(CreateForm, self).__init__(*args, **kwargs) if user is not None : self.fields['first_name'] .initial = user.first_name class Meta: model = creater fields = ( 'first_name', )En la vista, construyes el formulario con:
from django.contrib.auth.decorators import login_required @login_required def create(request, pk): if request.method == 'POST': form = CreateForm(request.POST , user=request.user ) if form.is_valid(): object = form.save() return render(request, 'going_create.html', {'object':object}) else: form = CreateForm( user=request.user ) return render(request, 'being_create.html', {'form':form})Nota : en caso de una solicitud POST exitosa, debe realizar una
redirect[Django-doc] para implementar el patrón Publicar/Redireccionar/Obtener [wiki] . Esto evita que realice la misma solicitud POST cuando el usuario actualiza el navegador.
Nota : puede limitar las vistas a una vista para usuarios autenticados con el decorador
@login_required[Django-doc] .