django forms exclude values from choicefield that are already into database

I want to exclude those options from the ChoiceField in the forms that has been already selected and are into the database. Below is the Code.

models.py

SEMESTER_CHOICES = (
    ("1", "1"),
    ("2", "2"),
    ("3", "3"),
    ("4", "4"),
    ("5", "5"),
    ("6", "6"),
    ("7", "7"),
    ("8", "8"),
)
class Publish(models.Model):
    dates = models.CharField(max_length=255, choices = SEMESTER_CHOICES)

    def __str__(self):
        return self.dates

form.py

SEMESTER_CHOICES = (
    ("1", "1"),
    ("2", "2"),
    ("3", "3"),
    ("4", "4"),
    ("5", "5"),
    ("6", "6"),
    ("7", "7"),
    ("8", "8"),
)

class PublishForm(forms.ModelForm):


    def __init__(self, **kwargs):
        super(PublishForm, self).__init__(self, **kwargs)
        selected_choices = [i.dates for i in Publish.objects.all()]
                self.fields['dates'].SEMESTER_CHOICES = ({(k, v) for k, v in SEMESTER_CHOICES
                                             if k not in selected_choices})

    class Meta:
        model = Publish
        fields = ['dates']

view.py

def add(request):
    if request.method == 'POST':
        form = PublishForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('mainapp:add')
    else:
        form = PublishForm()

    context = {
        'form' : form
    }
    return render(request, 'mainapp/add.html', context)

What am I doing wrong? Ive followed these 2 links here. [link1] and link2.
Any suggestions please.

Also I am getting the error : ‘PublishForm’ object has no attribute 'get’

Thank you

First of all - questions about using Django should go in the “using django” forum, so I’ve moved this there.

As for your problem - could you post a full traceback of the error you get? That’s mostly what is needed to work out the error (I could stare at the code until I see it, but it might take a long time)

I don’t think it’s gonna work as you expected, mainly because SEMESTES_CHOICES is supposed to be a constant, and it doesn’t exist inside the CharField instance (self.fields['dates']).

I would try changing the self.fields['dates'].SEMESTER_CHOICES to self.fields['dates'].choices.

In fact, the result is similar to the solution proposed in one of your references :slight_smile:

1 Like