Как отобразить параметры ChoiceField в шаблоне Django - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь отобразить ChoiceField в шаблоне django, я не знаю, правильно ли я делаю, но выбранный ChoiceField сохраняется в базе данных при отправке формы. Теперь, как мне получить выбранный вариант (например, заполнитель). Если поле выбора пусто, я не хочу видеть (---) Я хочу заполнитель (выберите свой пол). И когда выбран пол, я хочу, чтобы заполнитель был заменен значением (Мужчина вместо Выберите свой пол).

enter image description here

enter image description here

Views.py:

def profile_edit(request):
    updateform = UpdateUserForm(request.POST, instance=request.user)
    profileeditform = ProfileEditForm(request.POST, instance=request.user.profile)
    if request.method == 'POST':
        if updateform.is_valid() and profileeditform.is_valid(): 
            updateform.save()
            profileeditform.save()
            messages.info(request, 'Your profile was successfully updated!')
            return redirect('site:profile-edit')
        else:
            updateform = UpdateUserForm(instance=request.user)
            profileeditform = ProfileEditForm(instance=request.user.profile)
    
    #I am trying to get the value of gender choices field of user and pass it value to template, but i am getting an error "invalid literal for int() with base 10: 'male'"
    gender = Profile.objects.filter(user=request.user.profile.gender)

context = {
    'updateform': updateform,
    'profileeditform': profileeditform,
    'gender': gender,
}
return render(...)

Model.py:

GENDER = (
('male', 'male'),
('female', 'female'),
('custom', 'custom'),
('Prefer Not To Say', 'Prefer Not To Say'),
)

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True,null=True) 
    gender = models.CharField(max_length=50, choices=GENDER, verbose_name="gender", blank=True)

Forms.py:

class ProfileEditForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = (
            'bio',
            'phone',
            'gender',
        )

Template.html:

 

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Последний параграф документации по вариантам полей модели объясняет, как этого добиться:

.. добавить кортеж к вариантам, содержащим None; например (None, 'Your String For Display').

Итак, в your models.py:

GENDER = (
(None, 'Choose your gender'),
('male', 'male'),
('female', 'female'),
('custom', 'custom'),
('Prefer Not To Say', 'Prefer Not To Say'),
)

Вам, вероятно, потребуется изменить свой views.py, потому что вы были привязаны к формам перед проверкой, было ли request.method «POST». Следующее следует за логами c , рекомендованными в документации :

def profile_edit(request):
    if request.method == 'POST':
        updateform = UpdateUserForm(request.POST, instance=request.user)
        profileeditform = ProfileEditForm(request.POST, instance=request.user.profile)
        if updateform.is_valid() and profileeditform.is_valid(): 
            updateform.save()
            profileeditform.save()
            messages.info(request, 'Your profile was successfully updated!')
            return redirect('site:profile-edit')
    else:
        updateform = UpdateUserForm(instance=request.user)
        profileeditform = ProfileEditForm(instance=request.user.profile)

    context = {
        'updateform': updateform,
        'profileeditform': profileeditform,
        'gender': gender,
    }
    return render(...)

Обновите файл forms.py и назначьте виджет (это необходимо, если вы хотите установить имена классов и т. Д. c):

class ProfileEditForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = (
            'bio',
            'phone',
            'gender',
        )
        widgets = {
            'gender': forms.Select(attrs={'class': 'custom-select md-form'}),
        }

Тогда вы сможете просто отобразить поле формы в своем шаблоне:

{{ profileeditform.gender }}
0 голосов
/ 21 июня 2020

Вот как я смог решить эту проблему:

Примечание. Не включайте (Нет, «Выберите свой пол») в поле выбора, это переопределит выбранное значение и не будет отображаться в форме.

<select class="custom-select md-form" name="gender" id="id_gender">
#I added this new line to template, it shows the selected gender of a user in form when form is submitted.
<option value="{{ user.profile.gender }}">{{ user.profile.gender }}</option>

{% for male,female in profileeditform.fields.gender.choices %}
<option value="{{ male }}" {% if profileeditform.fields.gender.value == male %} selected=""{% endif %}>{{ female }}</option>
{% endfor %}
</select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...