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>