¿Cómo pasaría un objeto de usuario o una solicitud a mi formulario para usarlo como valor inicial para el cuadro de texto de entrada?
Por ejemplo, tengo mi formulario:
class ContactForm(forms.Form): contact_name = forms.CharField(required=True, initial="???") contact_email = forms.EmailField(required=True) subjects = forms.ChoiceField(choices=emailsubjects) content = forms.CharField( required=True, widget=forms.Textarea ) def __init__(self, *args, **kwargs): self.request = kwargs.pop("request") super(ContactForm, self).__init__(*args, **kwargs) self.fields['contact_name'].label = "Your name:" self.fields['contact_email'].label = "Your email:" self.fields['content'].label = "What do you want to say?" self.fields['subjects'].label = "Please, select the subject of your message"Donde quiero que mi nombre de usuario sea un valor predeterminado para el campo nombre_contacto.
Aquí está mi views.py, donde llamo al formulario:
def ContactsView(request): form_class = ContactForm(request=request) # new logic! if request.method == 'POST': form = form_class(data=request.POST) if form.is_valid(): contact_name = request.POST.get( 'contact_name' , '') contact_email = request.POST.get( 'contact_email' , '') form_content = request.POST.get('content', '') subjects = form.cleaned_data['subjects'] subjects = dict(form.fields['subjects'].choices)[subjects] # Email the profile with the # contact information template = get_template('threeD/email/contact_template.txt') context = Context({ 'contact_name': contact_name, 'subjects': subjects, 'contact_email': contact_email, 'form_content': form_content, }) content = template.render(context) email = EmailMessage( "New message from " + contact_name, content, "Message - " + subjects + ' ', ['smart.3d.printing.facility@gmail.com'], headers={'Reply-To': contact_email} ) email.send() messages.success(request, "Thank you for your message.") return redirect('/index/contacts/') return render(request, 'threeD/contacts.html', { 'form': form_class, })Cualquier ayuda sería muy apreciada
Ha cambiado su formulario para tomar el objeto de solicitud. Por lo tanto, puede acceder a self.request.user dentro de los métodos de su formulario:
class ContactForm(forms.Form): ... def __init__(self, *args, **kwargs): self.request = kwargs.pop("request") super(ContactForm, self).__init__(*args, **kwargs) self.fields['contact_name'].label = "Your name:" self.fields['contact_name'].initial = self.request.user.first_nameTambién debe actualizar su vista para pasar el objeto de solicitud. Recuerde actualizar el código para las solicitudes GET y POST.
if request.method == 'POST': form = ContactForm(data=request.POST, request=request) ... else: # GET request form = ContactForm(request=request) Finalmente, al pasar la solicitud al formulario, la ha acoplado estrechamente a la vista. En su lugar, podría ser mejor pasar al user al formulario. Esto facilitaría probar el formulario por separado de la vista. Si cambia el formulario, recuerde actualizar también la vista.
Debe pasar los valores iniciales en la vista:
puntos de vista:
def ContactsView(request): form_class = ContactForm(request=request, initial={'contact_name': request.user.first_name}) ...