簡體   English   中英

使用過濾器時,UpdateView 不顯示現有數據

[英]UpdateView does not show existing data when using filter

我對 Django 很陌生,我需要幫助。

我的問題與 Mike 在他的案例中遇到的問題非常相似: UpdateView not popating form with existing data ,但我還沒有找到解決方案。

我的目標是僅查看屬於組織成員的用戶的所有者下拉選擇列表。

模型.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]... 行,那么所有者字段將顯示數據庫中保存的值,但隨后我可以在下拉列表中看到所有用戶。 啟用查詢集后,選擇列表會顯示正確的用戶,但保存的值不可見。

視圖.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!')

在 Mikes 的案例中,Chiheb 評論說“使用 UpdateView 有點棘手。因此,為了初始化表單的數據,您需要在視圖本身而不是在表單中進行初始化。

無法向 UpdateView 添加過濾器的原因是什么?

請有人幫我解決我的問題。 謝謝。

更新

沒有過濾。 數據庫中的值可見

沒有過濾。 下拉列表顯示系統中的所有用戶

過濾器已啟用。 值不可見

過濾器已啟用。 下拉列表顯示正確的值

問題是您模型中的owner是 FK 到User模型,但您正在通過OrganizationMembers過濾表單中的查詢集。 使它相同,問題應該消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM