2

我正在制作一个用于创建未发布Artist实例的表单,然后Artwork在发布前添加到艺术家。

我有经理隐藏published=False艺术家,不知道如何绕过这个ForeignKey

模型.py

class PublishedManager(models.Manager):
    """Returns only published Artists in queryset"""
    def get_query_set(self):
        qs = super(VisibleManager, self).get_query_set()
        qs = qs.filter(status='published')
        return qs

class Artist(models.Model):
    objects = PublishedManager() # Used overall on the site to hide published=False objects
    admin_objects = models.Manager() # Default manager Will be used in admin to show invisible     objects too

class Artwork(models.Model):
    artist= models.ForeignKey(Artist)

表格.py

class ArtworkForm(forms.ModelForm):


    def __init__(self,  *args, **kwargs):
        super(ArtworkForm,self).__init(args,kwargs)
        from django.db import models
        self.fields['artist'].queryset = Artist.admin_objects.all()

>>> form=Artwork_form(artist=180) #unpublished artist pk
>>> form.errors

Model artist with pk 180 does not exist

我需要让表格“看到”FK 中未发表的艺术家,我该如何实现?

谢谢你。

4

1 回答 1

3

我找到了解决方案!!!

原始信息在这里http://www.hoboes.com/Mimsy/hacks/custom-managers-django-foreignkeys/

我实现了CustomManagerForeignKey这篇文章的作者所写的一个例外(否则将无法正常工作):

用法:

class Artwork(models.Model):
    artist= CustomManagerForeignKey(Artist, manager=Artist.admin_objects)

并在以下方面对此进行了修复CustomManagerForeignKey

class CustomManagerForeignKey(models.ForeignKey):
    def __init__(self, *args, **kwargs):
        if 'manager' in kwargs:
            self.customManager = kwargs['manager'] #Here i removed the () in the end of the line
            del kwargs['manager']
        else:
            self.customManager = None
        super(CustomManagerForeignKey, self).__init__(*args, **kwargs)
于 2014-07-21T17:33:47.287 回答