Django ChoiceField Django ChoiceField django django

Django ChoiceField


First I recommend you as @ChrisHuang-Leaver suggested to define a new file with all the choices you need it there, like choices.py:

STATUS_CHOICES = (    (1, _("Not relevant")),    (2, _("Review")),    (3, _("Maybe relevant")),    (4, _("Relevant")),    (5, _("Leading candidate")))RELEVANCE_CHOICES = (    (1, _("Unread")),    (2, _("Read")))

Now you need to import them on the models, so the code is easy to understand like this(models.py):

from myApp.choices import * class Profile(models.Model):    user = models.OneToOneField(User)        status = models.IntegerField(choices=STATUS_CHOICES, default=1)       relevance = models.IntegerField(choices=RELEVANCE_CHOICES, default=1)

And you have to import the choices in the forms.py too:

forms.py:

from myApp.choices import * class CViewerForm(forms.Form):    status = forms.ChoiceField(choices = STATUS_CHOICES, label="", initial='', widget=forms.Select(), required=True)    relevance = forms.ChoiceField(choices = RELEVANCE_CHOICES, required=True)

Anyway you have an issue with your template, because you're not using any {{form.field}}, you generate a table but there is no inputs only hidden_fields.

When the user is staff you should generate as many input fields as users you can manage. I think django form is not the best solution for your situation.

I think it will be better for you to use html form, so you can generate as many inputs using the boucle: {% for user in users_list %} and you generate input with an ID related to the user, and you can manage all of them in the view.


Better Way to Provide Choice inside a django Model :

from django.db import modelsclass Student(models.Model):    FRESHMAN = 'FR'    SOPHOMORE = 'SO'    JUNIOR = 'JR'    SENIOR = 'SR'    GRADUATE = 'GR'    YEAR_IN_SCHOOL_CHOICES = [        (FRESHMAN, 'Freshman'),        (SOPHOMORE, 'Sophomore'),        (JUNIOR, 'Junior'),        (SENIOR, 'Senior'),        (GRADUATE, 'Graduate'),    ]    year_in_school = models.CharField(        max_length=2,        choices=YEAR_IN_SCHOOL_CHOICES,        default=FRESHMAN,    )


If your choices are not pre-decided or they are coming from some other source, you can generate them in your view and pass it to the form .

Example:

views.py:

def my_view(request, interview_pk):    interview = Interview.objects.get(pk=interview_pk)    all_rounds = interview.round_set.order_by('created_at')    all_round_names = [rnd.name for rnd in all_rounds]    form = forms.AddRatingForRound(all_round_names)    return render(request, 'add_rating.html', {'form': form, 'interview': interview, 'rounds': all_rounds})

forms.py

class AddRatingForRound(forms.ModelForm):    def __init__(self, round_list, *args, **kwargs):        super(AddRatingForRound, self).__init__(*args, **kwargs)        self.fields['name'] = forms.ChoiceField(choices=tuple([(name, name) for name in round_list]))    class Meta:        model = models.RatingSheet        fields = ('name', )

template:

<form method="post">    {% csrf_token %}    {% if interview %}         {{ interview }}    {% endif %}    {% if rounds %}    <hr>        {{ form.as_p }}        <input type="submit" value="Submit" />    {% else %}        <h3>No rounds found</h3>    {% endif %}</form>