Hi,
Inside your "post" method, you have this line:
context = super(AccountProfilesView, self).post(request, *args, **kwargs)
in that case "context" is a HttpResponse object[0]. May be, from the name
you use for the variable, you think this is a simple dict as those used to
pass context to render functions; it is not.
You can use HttpResponse as a dictionary to put HTTP headers in the
response [1], so line 184 is setting an HTTP header with a value of the
HTML to render the form; that is not what you want.
You have to remove that line and create your context with something like:
context = {}
And you have to return an HttpResponse object, probably by calling one of
the render functions [2].
[0]
https://docs.djangoproject.com/en/1.11/ref/request-response/#httpresponse-objects
[1]
https://docs.djangoproject.com/en/1.11/ref/request-response/#setting-header-fields
[2] https://docs.djangoproject.com/en/1.11/topics/http/shortcuts/#render
On Saturday, April 8, 2017 at 5:06:34 PM UTC-4, Bernardo Garcia wrote:
>
>
> I have the following forms to each user profile
>
> class UserUpdateForm(forms.ModelForm):
> class Meta:
> widgets = {'gender':forms.RadioSelect,}
> fields = ("username", "email", "is_student",
> "is_professor", "is_executive",)
> model = get_user_model() #My model User
>
> class StudentProfileForm(forms.ModelForm):
> class Meta:
> model = StudentProfile
> fields = ('origin_education_school',current_education_school',
> 'extra_occupation')
>
> class ProfessorProfileForm(forms.ModelForm):
> class Meta:
> model = ProfessorProfile
> fields = ('occupation',)
>
> class ExecutiveProfileForm(forms.ModelForm):
> class Meta:
> model = ExecutiveProfile
> fields = ('occupation', 'enterprise_name',
> 'culturals_arthistic','ecological')
>
> I have an URL which call to my AccountProfilesView class based view which
> create an instance of the previous forms according to the user profile:
>
> url(r"^profile/(?P<slug>[\w\-]+)/$",
> views.AccountProfilesView.as_view(),
> name='profile'
> ),
>
>
> My AccountProfilesView is this:
>
> I this moment, from the AccountProfilesView class based view I am create
> the different instances of each one of these forms, according to the
> user profile, then, if an user have the is_student profile their related
> form will be generated, and so, of this way to is_professor and
> is_executive profiles
>
> If an user have the three profiles (is_student, is_professor,is_executive )
> in one single form will be created or rendered the fields of the three
> forms associated to each user profile related.
>
> class AccountProfilesView(LoginRequiredMixin, UpdateView):
> # All users can access this view
> model = get_user_model()
> #success_url = reverse_lazy('dashboard')
> template_name = 'accounts/profile_form.html'
> fields = '__all__'
>
> def get_context_data(self, **kwargs):
> context = super(AccountProfilesView,
> self).get_context_data(**kwargs)
> user = self.request.user
>
> if not self.request.POST:
> if user.is_student:
> profile = user.get_student_profile()
> context['userprofile'] = profile
> context['form_student'] = forms.StudentProfileForm()
> if user.is_professor:
> profile = user.get_professor_profile()
> context['userprofile'] = profile
> context['form_professor'] =
> forms.ProfessorProfileForm()
> print ("profesor form is", context['form_professor'])
> if user.is_executive:
> profile = user.get_executive_profile()
> context['userprofile'] = profile
> context['form_executive'] =
> forms.ExecutiveProfileForm()
> return context
>
> def post(self, request, *args, **kwargs):
> self.object = self.get_object()
> context = super(AccountProfilesView, self).post(request,
> *args, **kwargs)
> user = self.request.user
> # if self.request.method == 'POST':
> if user.is_student:
> context['form_student'] = forms.StudentProfileForm(
> self.request.POST)
> elif user.is_professor:
> context['form_professor'] = forms.ProfessorProfileForm(
> self.request.POST)
> elif user.is_executive:
> context['form_executive'] = forms.ExecutiveProfileForm(
> self.request.POST)
> return context
>
> def form_valid(self, form):
> context = self.get_context_data(form=form)
> user = self.request.user
> user = form.save()
> if user.is_student:
> student = context['form_student'].save(commit=False)
> student.user = user
> student.save()
> if user.is_professor:
> professor = context['form_professor'].save(commit=False)
> professor.user = user
> professor.save()
> if user.is_executive:
> executive = context['form_executive'].save(commit=False)
> executive.user = user
> executive.save()
> return super(AccountProfilesView, self).form_valid(form)
>
> def get_success_url(self):
> return reverse('dashboard')
>
> And in my template, I have the following small logic:
>
> <form method="POST">
> {% csrf_token %}
> {% if userprofile.user.is_student %}
>
> <div align="center"><i>My Student Profile data</i></div>
> {% bootstrap_form form_student %}
> {% endif %}
>
>
> {% if userprofile.user.is_professor %}
> <div align="center"><i>My Professor Profile data</i></div>
> {% bootstrap_form form_professor %}
> {% endif %}
>
>
> {% if userprofile.user.is_executive %}
> <div align="center"><i>My Executive Profile data</i></div>
>
> {% bootstrap_form form_executive %}
> {% endif %}
>
> <input type="submit" value="Save Changes" class="btn
> btn-default">
> </form>
>
>
> From the perspective of show the forms with the fields according to the
> userprofile, this approach works, the data or fields related to the user
> profile are denoted or renderised
>
> For example this user have the three profiles and in the screen of
> profile in the application, show the three forms:
>
> <https://i.stack.imgur.com/lUfRL.jpg>
>
>
> But at moment of perform update of such view screen form, (in which each
> profile have their respective model/table in where their own data are
> managed)
> happened the following:
>
> When I click en *Save Changes *there is an error:
>
> File "/home/bgarcial/workspace/ihost_project/accounts/views.py", line 185,
> in post
> self.request.POST)
> File
> "/home/bgarcial/.virtualenvs/ihost/lib/python3.5/site-packages/django/http/response.py",
>
> line 142, in __setitem__
> value = self._convert_to_charset(value, 'latin-1',
> mime_encode=True)
> File
> "/home/bgarcial/.virtualenvs/ihost/lib/python3.5/site-packages/django/http/response.py",
>
> line 115, in _convert_to_charset
> raise BadHeaderError("Header values can't contain newlines (got
> %r)" % value)
> django.http.response.BadHeaderError: Header values can't contain
> newlines (got '<tr><th><label for="id_origin_education_school">Origin
> education institute:</label></th><td><input id="id_origin_education_school"
> maxlength="128" name="origin_education_school" type="text"
> value="Universidad de la AmazonÃa" required /></td></tr>\n<tr><th><label
> for="id_current_education_school">Current education
> institute:</label></th><td><input id="id_current_education_school"
> maxlength="128" name="current_education_school" type="text"
> value="Universida EAFIT" required /></td></tr>\n<tr><th><label
> for="id_extra_occupation">Extra occupation:</label></th><td><input
> id="id_extra_occupation" maxlength="128" name="extra_occupation"
> type="text" value="Mother" required /></td></tr>')
> [08/Apr/2017 20:21:13] "POST /accounts/profile/luisa/ HTTP/1.1" 500
> 108206
>
> More precisely:
>
> <https://i.stack.imgur.com/g7dhD.png>
>
>
> I think so, is that at the moment of create the form instances of the
> Django forms, and I denote that the data to be included in the request and
> the POST operation, this is not validated of some way
>
> I unknown the traceback error:
>
> BadHeaderError
> Header values can't contain newlines (got '<tr><th>) .....
>
> I've searched that error, but I don't have related information about it.
>
> Best Regards
>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/5f19a008-2c3a-4647-b4e2-d2bbce16d4d9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.