首页 > 解决方案 > Django-select2 按所有者过滤小部件数据(相关用户)

问题描述

我正在使用 django-select2 和基于类的视图(创建、更新、删除视图) 在 CreateView 中,我在表单中使用 form_class。在这种形式中,我使用小部件来选择相关对象。我需要通过 created_user (所有者)过滤这些对象。如何将我的方案中的当前用户传递给小部件 ModelSelect2MultipleWidget 类?

表格.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)

视图.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)

标签: djangodjango-class-based-viewsdjango-widgetdjango-select-relateddjango-select2

解决方案


在这里解释

我需要使用 search_fields 更改 mixin 并将 data_view 参数推送给它:

表格.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)

使用 select2 的 json 答案请求创建视图。

视图.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"),

推荐阅读