2015-06-25 3 views
0

Я пытаюсь использовать пользовательский CHOICE в MultipleChoiceField. Я могу спасти все, кроме сотрудников.Не удается сохранить ManyToMany с помощью MultipleChoiceField

models.py

class Employee(models.Model): 
    employee_id = models.CharField(max_length=20, unique=True) 

    def __str__(self): 
     return '%s' % self.employee_id 


class Task(models.Model): 
    employee = models.ManyToManyField(Employee, blank=True, null=True) 
    task = models.CharField(max_length=100) 
    comment = models.CharField(max_length=200) 

    def __str__(self): 
     return '%s' % self.task 

forms.py

class TaskCreateForm(forms.ModelForm): 

    CHOICES = (
     ('123', 'Adam'), 
     ('321', 'John'), 
     ('666', 'Lucy'), 
    ) 

    employee = forms.MultipleChoiceField(choices=CHOICES, required=True) 


    def __init__(self, custom_choices=None, *args, **kwargs): 
     super(TaskCreateForm, self).__init__(*args, **kwargs) 
     if custom_choices: 
      self.fields['employee'].choices = custom_choices 

    class Meta: 
     model = Task 

Поэтому в основном я добавил custom_choices, потому что я хочу показать в названиях MultipleChoiceField Служебные ('Adam', 'John' ,'Lucy') и сохранить их

employee_id (» 123 ',' 321 ', 666').

views.py

class TaskCreateView(CreateView): 
    model = Task 
    form_class = TaskCreateForm 
    template_name = "task/create.html" 

    def form_valid(self, form): 
     self.object = form.save() 
     return redirect('/task_page/') 

Я могу видеть форму на моей странице, и я могу выбрать сотрудников, но employee_id не спасает. Сохраняются только другие поля task и comment.

Обновление для осветления:

Там нет имен в моих моделях. Я просто хочу показать пользовательские имена для employee_id. Вот почему мне нужно ('123', 'Adam') - я хочу сохранить '123', но отобразить в моей форме 'Adam'

ответ

1

Ну, основное решение по-прежнему остается неизменным:

queryset=Employee.objects.filter(employee_id__in=['some_id', 'other_id']) 

Ключевым моментом является то, что вы должны использовать ModelMultipleChoiceField.

Если вы хотите отображать имена, а не идентификаторы, существует несколько способов сделать это, например. get_name метод на модели и обычая ModelMultipleChoiceField, как описано здесь: https://stackoverflow.com/a/3167840/1180983

Так что будет выглядеть примерно так:

EMPLOYEE_NAMES = { 
    '123': 'Adam', 
    '321': 'John', 
} 

class Employee(models.Model): 
    employee_id = models.CharField(max_length=20, unique=True) 

    def get_name(self): 
     return EMPLOYEE_NAMES.get(self.employee_id, 'unknown') 

class EmployeeMultipleChoiceField(ModelMultipleChoiceField): 
    def label_from_instance(self, obj): 
     return obj.get_name() 

class TaskCreateForm(forms.ModelForm) 
    employees = EmployeeMultipleChoiceField(
     queryset=Employee.objects.filter(employee_id__in=['123', '321']) 
    ) 
+0

Эй, у меня есть '' AttributeError: объект 'module' не имеет атрибута 'EmployeeMultipleChoiceField''' PyCharm выделяет 'EmployeeMultipleChoiceField' в' TaskCreateForm' – HereHere

+0

Вы должны изменить 'forms.EmployeeMultipleChoiceField' 'EmployeeMultipleChoiceField' – HereHere

+0

Право. Спасибо! –

0

Ваш ModelForm не знает, что делать с полем сотрудника на save(), потому что вы никому не говорите, и это поле не связано ни с одной моделью. Вместо этого используйте ModelMultipleChoiceField.

Если вам необходимо ограничить выбор ModelMultipleChoiceField позволяет, использовать queryset аргумент:

employees = forms.ModelMultipleChoiceField(
    queryset=Employee.objects.filter(name__in=['Alice', 'Bob']) 
) 

Кроме того, думать о том, где использовать множественное число, и где использовать особые имена, так что вы не путайте себя (employees вместо employee выше).

+0

Нет, не вы, ребята, не понимаю. Мне нужно только отображать имена и сохранять 'employee_id'. В моих моделях нет имен. Я просто хочу отображать в именах полей выбора, но сохраняю только идентификаторы. – HereHere

+0

Модель сотрудника содержит только 'employee_id'. У меня нет имен. Я просто хочу отображать пользовательские имена для 'employee_id'. Я обновил свой пост – HereHere

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