2017-01-30 7 views
0

Я хочу, чтобы выпадающее меню было заполнено результатами запроса в моей форме для моего поля coach_id. Я хочу, чтобы пользователь мог выбрать один вариант, а не несколько. Я пытаюсь использовать ModelMultipleChoiceField ... неудачно .....Выберите поле в форме на основе запроса в той же модели

class PersonForm(forms.ModelForm): 
    coach_id = forms.ModelMultipleChoiceField(queryset=Person.objects.filter(assign_as_coach="Person is a coach"), widget=forms.Select()) 

    class Meta: 
     model = Person 
     fields = [ 'id', 'first_name', 'surname', 'email', 'coach_id', 'assign_as_coach', 'position', 'contract_type'] 
     # exclude = ['initials', 'sam'] 
     labels = { 
      'first_name': _('First Name'), 
      'surname': _('Surname'), 
      'email': _('Email'), 
      'coach_id': _('Select Coach'), 
      'assign_as_coach': _('Assign as a coach?'), 
      'position': _('Position'), 
      'contract_type': _('Contract Type'), 
     } 

     widgets = { 
     'first_name': forms.TextInput(
      attrs={'placeholder': 'First Name', 'id': 'person-first-name'} 
     ), 
     'surname': forms.TextInput(
      attrs={'placeholder': 'Surname', 'id': 'person-surname'} 
     ), 
     'email': forms.TextInput(
      attrs={'placeholder': 'Email Address', 'id': 'person-email'} 
     ), 
     # 'coach_id': forms.Select(
     # attrs={'placeholder': 'Select Coach', 'id': 'person-coach-id'} 
     #), 
     'assign_as_coach': forms.Select(
      attrs={'placeholder': 'Assign person as a coach?', 'id': 'person-is-coach'} 
     ), 
     'position': forms.TextInput(
      attrs={'placeholder': 'Current position', 'id': 'person-position'} 
     ), 
     'contract_type': forms.Select(
      attrs={'placeholder': 'Select Contract Type', 'id': 'person-contract'} 
     ), 

Вот моя модель:

class Person(models.Model): 

    FT = "Full-Time" 
    PT = "Part-Time" 
    C = "Contract" 
    Z = "Zero hours" 

    CONTRACT_CHOICES = (
    (FT, "Full-Time"), 
    (PT, "Part-Time"), 
    (C, "Contract"), 
    (Z, "Zero hours"), 
    ) 

    Y = "Yes" 
    N = "No" 

    IS_COACH_CHOICES = (
    (Y, "Person is a coach"), 
    (N, "Person is NOT a coach"), 
    ) 


    first_name = models.CharField(max_length=15, default='') 
    surname = models.CharField(max_length=30, default='') 
    initials = models.CharField(max_length=5, default='', null=True, blank=True) 
    email = models.EmailField(default='', null=True, blank=True) 
    coach_id = models.IntegerField(null=True) 
    assign_as_coach = models.CharField(null=True, blank=True, choices=IS_COACH_CHOICES, default="Person is NOT a coach", max_length=5) 
    position = models.CharField(max_length=30, default='', null=True, blank=True) 
    contract_type = models.CharField(max_length=30, default='FT', choices=CONTRACT_CHOICES) 
    user_name_check = models.CharField(max_length=30, default='', null=True, blank=True) 
    def __unicode__ (self): 
     return self.surname + ', ' + self.first_name 

На данный момент у меня есть coach_id выбора поля рендеринга на шаблоне, который ничего не имеет и плохо отформатирован.

+0

Если вы хотите выбрать только один вариант, почему вы используете поле с несколькими вариантами выбора? –

+0

Я читал по другому вопросу, что самый простой способ фильтрации на основе запроса - использовать ModelMultipleChoiceField, поэтому я просто вслепую вскочил, не думая об этом - я использовал несколько месяцев, так голый со мной. То, что я на самом деле хочу, является полем выбора, но я не могу понять, как основывать выбор с помощью набора запросов, когда результаты запроса могут отличаться каждый раз, когда кто-то открывает форму. –

+0

Мой ответ ниже похож на другой вопрос Я ответил ранее: http://stackoverflow.com/questions/41934040/django-cannot-assign-ujoan-manel-despesa-nomtreballador-must-be-a-trebal –

ответ

0

Вы можете переименовать coach_id в coach (иначе вы получите конфликтующие имена столбцов) и сделайте его ForeignKey той же моделью: coach=models.ForeignKey('self', on_delete=models.CASCADE, null=True). Это приведет к тому, что поле вашего тренера станет выпадающим списком.

Вы можете ограничить выбор выпадающего меню настроек атрибута поля queryset в init методе вашей формы:

self.fields['coach'].queryset = Person.objects.filter(assign_as_coach__exact='Y').

+0

Да, за исключением того, что поле должно называться просто «тренером» 'в этом случае. –

+0

@ DanielRoseman хорошая точка, спасибо! –

+0

Отлично, я попробую это сейчас. Почему бы не использовать виджет «Выбор», хотя в форме? Кроме того, использование self в этом дает мне «NameError: name« self »не определено». Кажется, что это работает, если я вместо этого использую «Person» .... но я не понимаю, почему само не работает для меня –

 Смежные вопросы

  • Нет связанных вопросов^_^