Django ChoiceField

后端 未结 4 1283
醉话见心
醉话见心 2020-12-02 10:42

I\'m trying to solve following issue:

I have a web page that can see only moderators. Fields displayed on this page (after user have registered):
Username, Firs

相关标签:
4条回答
  • 2020-12-02 11:05

    Better Way to Provide Choice inside a django Model :

    from django.db import models
    
    class 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,
        )
    
    0 讨论(0)
  • 2020-12-02 11:09

    New method in Django 3

    you can use Field.choices Enumeration Types new update in django3 like this :

    from django.db import models
    
    class Status(models.TextChoices):
        UNPUBLISHED = 'UN', 'Unpublished'
        PUBLISHED = 'PB', 'Published'
    
    
    class Book(models.Model):
        status = models.CharField(
            max_length=2,
            choices=Status.choices,
            default=Status.UNPUBLISHED,
        )
    

    django docs

    0 讨论(0)
  • 2020-12-02 11:10

    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>
    
    0 讨论(0)
  • 2020-12-02 11:22

    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.

    0 讨论(0)
提交回复
热议问题