Django-select2 фильтрует данные виджета по владельцу (связанный пользователь) - PullRequest
0 голосов
/ 10 марта 2019

Я использую django-select2 с представлением на основе классов (создание, обновление, удаление представления) В CreateView я использую form_class с моей формы. В этой форме я использую виджеты для выбора связанных объектов. И мне нужно отфильтровать эти объекты с помощью create_user (владельца). Как передать текущего пользователя в моей схеме в класс виджетов ModelSelect2MultipleWidget?

forms.py:

class AccountSearchFieldMixin(object):
    search_fields = [
        'login__icontains',
        'password__icontains',
        'phone__icontains',
    ]


class AccountSelect2TagWidget(AccountSearchFieldMixin, ModelSelect2MultipleWidget):
    model = VkAccount
    queryset = VkAccount.objects.exclude(proxy__isnull=True)

    def create_value(self, value):
        self.get_queryset().create(name=value)


class TaskVkInvitationsFriendsSearchForm(forms.ModelForm):
    # country = ModelChoiceField(Countries.objects.all(), empty_label=None, label='Страна')f

    class Meta:
        model = TaskVkInvitationsFriendsSearch
        exclude = ['type', 'date_creation', 'date_update', 'maintask', 'invited_friends']
        widgets = {
            'accounts': AccountSelect2TagWidget,
            'cities': CitiesSelect2TagWidget,
            'scheduler_data': forms.HiddenInput,
            # 'country': CountrySelect2TagWidget
        }

    def __init__(self, *args, **kwargs):
        self.owner = kwargs.pop('owner')
        super(TaskVkInvitationsFriendsSearchForm, self).__init__(*args, **kwargs)

views.py:

class BaseTaskMixin:
    model = TaskVkInvitationsFriendsSearch
    form_class = TaskVkInvitationsFriendsSearchForm
    success_url = reverse_lazy('vk_bot_tasks_list')
    template_name = 'vk_bot/create_task.html'


class TaskCreateView(BaseTaskMixin, CreateView):

    def form_valid(self, form):
        model = form.save(commit=False)
        t = Task()
        t.save()
        model.maintask = t
        model.save()
        form.instance.owner = self.request.user
        return super(TaskCreateView, self).form_valid(form)

1 Ответ

1 голос
/ 10 марта 2019

Объяснение здесь

Мне нужно изменить mixin с полями search_fields и передать ему аргумент data_view:

forms.py:

class AccountSearchFieldMixin(object):
    search_fields = [
        'login__icontains',
        'password__icontains',
        'phone__icontains',
    ]

    def __init__(self, *args, **kwargs):
        kwargs['data_view'] = 'account_json'
        super(AccountSearchFieldMixin, self).__init__(*args, **kwargs)

createпросмотр с запросом JSON ответа для select2.

views.py:

class AccountJsonView(AutoResponseView):

    def get_queryset(self):
        qs = super().get_queryset()
        return qs.filter(owner=self.request.user)

И последнее изменение в urls.py:

path('fields/account.json', login_required(views.AccountJsonView.as_view()), name="account_json"),
...