0

I'm using django-select2 with class based view (create, update, delete view) In CreateView, i'm use form_class in view with my form. In this form i'm use widgets for selecting related objects. And i need filtering these objents by created_user (owner). How can i pass current user in my scheme to widget ModelSelect2MultipleWidget class?

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 Answers1

1

Explanation here

I need change mixin with search_fields and push data_view argument to it:

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 view with request for json answer for select2.

views.py:

class AccountJsonView(AutoResponseView):

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

And last change in urls.py:

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