UpdateView не показывает существующие данные при использовании фильтра - PullRequest
0 голосов
/ 12 марта 2020

Я совсем новичок с Django, и мне нужна помощь.

Моя проблема очень похожа на то, что было у Майка в его случае: UpdateView не заполняет форму существующими данными , но я решение еще не найдено.

Моя цель - просмотреть выпадающий список владельцев, в который входят только те пользователи, которые являются членами организации.

models.py

# organizations.models.py
...
from accounts.models import User
from core.models import TimeStampModel
...

class Organization(TimeStampModel, models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    name = models.CharField(
        verbose_name=_('Name'),
        max_length=255,
        unique=True
    )

    code = models.CharField(
        verbose_name=_('Code'),
        max_length=255,
        null=True,
        blank=True
    )

    owner = models.ForeignKey(
        User,
        on_delete=models.PROTECT,
        verbose_name=_('Owner'),
        related_name='owner',
        help_text=_('Organization Owner and Contact Person'),
    )

    slug = models.SlugField(verbose_name=_('Organization key'), unique=True)

    ...

    class Meta:
        verbose_name = _('Organization')
        verbose_name_plural = _('Organization')
        ordering = ['name', 'code']

    def __str__(self):
        return f'{self.name}, {self.code}'

    # Create automatically slug value from organization name field.
    # In case similar is exist then add extra count digit end of slug.
    def _get_unique_slug(self):
        slug = slugify(self.name)
        unique_slug = slug
        num = 1
        while Organization.objects.filter(slug=unique_slug).exists():
            unique_slug = '{}-{}'.format(slug, num)
            num += 1
        return unique_slug

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = self._get_unique_slug()

        self.next_update = timezone.now() + relativedelta(
            months=self.update_interval)
        super(Organization, self).save(*args, **kwargs)


    def get_absolute_url(self):
        kwargs = {
            'slug': self.slug
        }
        return reverse('organization_main_page', kwargs=kwargs)


class OrganizationMembers(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    organization = models.ForeignKey(
        Organization,
        on_delete=models.CASCADE,
        verbose_name=_('Organization')
    )

    member = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        verbose_name=_('Member'),
        null=True,
        blank=True
    )

    organization_admin = models.BooleanField(
        verbose_name=_('Organization admin'),
        default=False
    )

    class Meta:
        verbose_name = _('Organization: Member')
        verbose_name_plural = _('Organization: Members')
        ordering = ['organization', 'member']
        unique_together = ('organization', 'member')

    def __str__(self):
        return f'{self.member}'

    def get_absolute_url(self):
        kwargs = {
            'slug': self.slug
        }
        return reverse('organization_detail', kwargs=kwargs)

формы .py

# organizations.forms.py
....
from accounts.models import User
from .models import Organization, OrganizationMembers
...

class OrganizationUpdateForm(forms.ModelForm):

    class Meta:
        model = Organization
        fields = '__all__'
        exclude = ('date_created', 'created_by', 'created_by_id',
                   'last_updated', 'last_updated_by', 'last_updated_by_id',
                   'next_update', 'slug')


    # Restrict user selection lists to view only members of the organization
    def __init__(self, *args, **kwargs):
        inst = kwargs.get('instance', None)

        super(OrganizationUpdateForm, self).__init__(*args, **kwargs)

        self.fields['owner'].queryset = OrganizationMembers.objects.\    # <--- !!!
             filter(organization_id=inst.id)



В файле forms.py, если я закомментирую строку self.field ['owner] ..., в поле владельца будет показано сохраненное значение из базы данных, но тогда я смогу увидеть всех пользователей. в раскрывающемся списке. Когда набор запросов включен, в списке выбора отображаются правильные пользователи, но сохраненное значение не отображается.

views.py

# organizations.views.py

from .forms import OrganizationUpdateForm

from accounts.models import User
from .models import Organization, OrganizationMembers


class OrganizationUpdateView(LoginRequiredMixin, UpdateView):
    model = Organization
    form_class = OrganizationUpdateForm
    template_name = 'organizations/organization_update.html'
    success_url = reverse_lazy('organizations')

    # Save data and set current user to last updated by fields
    def form_valid(self, form):
        object = form.save(commit=False)
        object.last_updated_by = self.request.user.get_full_name()
        object.last_updated_by_id = self.request.user

        return super(OrganizationUpdateView, self).form_valid(form)

    def get_queryset(self):
        criteria1 = Q(owner=self.request.user)
        criteria2 = Q(organizationmembers__member=self.request.user)
        criteria3 = Q(organizationmembers__organization_admin=1)
        org_list = Organization.objects.\
            filter(criteria1 | (criteria2 & criteria3)).distinct()

        if org_list.count() != 0:
            return org_list
        else:
            raise Http404('You don\'t have permissions!')

В случае с Майком Чихеб прокомментировал, что " с UpdateView это немного сложнее. Итак, чтобы инициализировать данные вашей формы, вам нужно сделать это в самом представлении, а не в форме."

В чем причина, по которой невозможно добавить фильтр в UpdateView?

Пожалуйста, кто-нибудь может помочь мне решить мою проблему. Спасибо.

ОБНОВЛЕНИЕ

Не отфильтровано. Значение из базы данных видно

Не фильтруется. В раскрывающемся списке отображаются все пользователи системы

Фильтр включен. Значение не отображается

Фильтр включен. Выпадающий список показывает правильный valeus

1 Ответ

0 голосов
/ 13 марта 2020

Проблема в том, что owner в ваших моделях - это модель от FK до User, но вы фильтруете набор запросов в форме по OrganizationMembers. Сделайте то же самое, и проблема должна исчезнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...