Как отобразить дополнительные поля о поле M2M в Django или переопределить select2-results__option - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу реализовать функцию, позволяющую пользователям выбирать других пользователей и добавлять их в поле «многие ко многим». Текущее состояние работает так, как я хочу, но я хочу иметь возможность отображать дополнительную информацию о пользователе, которого они выбирают, а не только его имя пользователя. Такие вещи, как first_name, last_name, информация о профиле и т. Д. - в идеале все это должно быть в одной строке, которую они видят при добавлении пользователя в свою очередь m2m, например:

John Smith | j.smith | j.smith@example.com

вместо:

j.smith

Я вижу элемент select2-results__option, и мне любопытно, могу ли я просто переопределить его дополнительной информацией. Если есть чистый способ сделать это через django, я бы предпочел сделать это таким образом, но на самом деле открыт для всего.

Views.py

class UserAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        if not self.request.user.is_authenticated:
            return User.objects.none()
        qs = User.objects.all()
        if self.q:
            qs = qs.filter(Q(username__icontains=self.q) |
                           Q(first_name__icontains=self.q) |
                           Q(last_name__icontains=self.q))

        return qs

forms.py

class UserSurveyQueueForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super().__init__(*args, **kwargs)
        self.fields['queue'].queryset = User.objects.all().exclude(pk=user)
        self.fields['queue'].required = False

    class Meta:
        model = UserSurveyQueue
        fields = ('queue',)
        widgets = {
            'queue': autocomplete.ModelSelect2Multiple(
                url='user-autocomplete',
            ),
        }

1 Ответ

0 голосов
/ 02 ноября 2018

Предполагая, что это для django-autocomplete-light , вы можете переопределить метод get_result_label вашего класса UserAutocomplete, чтобы изменить текст, показанный в раскрывающемся списке.

def get_result_label(self, result):
    return "{full_name}|{email}" .format(full_name = str(result), email = result.email)

Если вы хотите, чтобы это был симпатичный стол, вам придется углубиться в JavaScript Дала.

...