小编nor*_*mic的帖子

如何在Django admin中过滤filter_horizo​​ntal?

我正在寻找一种在过滤的查询集的基础上使用filter_horizo​​ntal的方法.

我试图将它与自定义管理器一起使用:

在models.py中:

class AvailEquipManager(models.Manager):
    def get_query_set(self):
        return super(AvailEquipManager, self).get_query_set().filter(id=3)

class Equipment(models.Model):
    description = models.CharField(max_length=50)
    manufacturer = models.ForeignKey(Manufacturer)
    [...]
    objects = models.Manager()
    avail = AvailEquipManager()

    def __unicode__(self):
        return u"%s" % (self.description)
Run Code Online (Sandbox Code Playgroud)

在admin.py中:

class SystemAdmin(admin.ModelAdmin):
    filter_horizontal = ('equipment',) # this works but obviously shows all entries
    #filter_horizontal = ('avail',)     # this does not work
Run Code Online (Sandbox Code Playgroud)

所以问题是,我如何减少filter_horizo​​ntal的左侧只显示特定的项目?

python django django-admin

9
推荐指数
2
解决办法
2万
查看次数

如何在Django Admin中使用can_add_related

我在这里读到了关于can_add_related的功能:https://code.djangoproject.com/ticket/9071

我尝试过这样使用它:

def get_form(self, request, obj=None, **kwargs):
    self.fields['person'].can_add_related = False
    return super(OperationAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但这会引发TypeError,我不知道如何解决这个问题.

有人能指出我正确的方向吗?

谢谢.

python django django-admin

7
推荐指数
1
解决办法
2124
查看次数

如何确保 Django 模型中只有一个条目为 True?

我一直在考虑实施“对于一种组合来说只有一个条目可能为真”。

一个项目通过一个中间表有n个成员(警卫)。

  • 每个 Guard 可能是 n 个项目的成员
  • 仅允许 Guard <-> Project 的一种组合 (unique_together)
  • 会员资格可能是“主要”会员资格 (is_main)
  • 但是:只有一个成员资格可以是主要成员资格。

我是否需要监督某些事情,或者我是否必须自己实施自定义验证?

要完成此操作,请参阅给定的模型:

class Project(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    shortname = models.CharField(_('shortname'), max_length=50)
    description = models.TextField(_('description'), blank=True)
    members = models.ManyToManyField(Guard, through='ProjectMembership')

    class Meta:
        unique_together = ['client', 'shortname']


class ProjectMembership(models.Model):
    guard = models.ForeignKey(Guard, on_delete=models.CASCADE)
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    is_main = models.BooleanField(_('is main project'), default=False)

    class Meta:
        unique_together = ['guard', 'project']
Run Code Online (Sandbox Code Playgroud)

python django django-models

6
推荐指数
1
解决办法
929
查看次数

使用 Python 的 QUOTE_NONNUMERIC 导入 csv 无法按预期工作

我无法弄清楚这一点,也许我因为长期关注同样的东西而变得盲目......

我在 CSV 文件中有这样的行:

""BIN"",""Afg"",""SONIC/SONIC JET/"",1,8.9095,""Due to the dynamic nature of the exemptions granted to many operators, the Contract Price does not reflect V.A.T. / G.S.T., Mineral Oil Taxes, Federal Excise Taxes or other taxes to which an operator may be exempt.  Please contact your salesperson or World Fuel Services if you require assistance in generating a fuel price estimate."",""N/A"",""01-NOV-2013"
Run Code Online (Sandbox Code Playgroud)

我正在尝试像这样导入:

data = csv.DictReader(open(newdatafile), delimiter=',', quoting=csv.QUOTE_NONNUMERIC)
data.fieldnames = [
    'iata', 'country', 'fbo', 'quantity', 'price', 'remarks', 'special', 'validdate'
]

for row …
Run Code Online (Sandbox Code Playgroud)

python csv quoting double-quotes

5
推荐指数
1
解决办法
2万
查看次数

具有模型属性的 Django 管理 search_fields

我正在尝试使用模型中的属性作为 django admin (1.2) 中的字段。

这是我的代码的示例:

class Case(models.Model):
    reference = models.CharField(_(u'Reference'), max_length=70)
    client_read = models.BooleanField(default=0)

    def __unicode__(self):
        return self.case_id

    @property
    def case_id(self):
        """ unique case ID """
        number = (settings.CASE_ID_LENGTH - len(str(self.id))) * "0" + str(self.id)
        return '%(year)s%(unique_id)s' % { 
            'year': self.case_date.strftime("%y"),
            'month': self.case_date.strftime("%m"),
            'unique_id': number}
Run Code Online (Sandbox Code Playgroud)

以及 admin.py 的部分:

class OrderAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
    [...]
    search_fields = ('id','case','req_surname','req_forename','req_company')
Run Code Online (Sandbox Code Playgroud)

我可以将该字段称为“case”(如示例中所示),但这给了我一个TypeError:相关字段具有无效查找:icontains

当然,它以相关字段的方式工作:所以我可以使用case__id,然后我可以使用 id 作为搜索查询。但这对用户来说有点恼火,因为 caseid 显示不同。

有没有办法像显示的那样使用 case_id 作为搜索查询(年+月+id)?

django django-admin

4
推荐指数
1
解决办法
6497
查看次数

了解django admin readonly_fields

我创建了一些代码来区分Django admin中的两个用户组,导致只读取所有字段或仅显示其中的一些字段,这些字段直接在ModelAdmin类中设置.

这里首先是代码:

class PersonAdmin(admin.ModelAdmin):
    readonly_fields = ('created_at','created_by',)

def get_form(self, request, obj=None, **kwargs):
    if obj:     # we are in edit mode
        if request.user.is_superuser:
            self.readonly_fields = ()
        else:
            for group in request.user.groups.all():
                if str(group) == 'readonlyuser':
                    allfields = tuple(obj._meta.get_all_field_names())
                    self.readonly_fields = allfields

    return super(PersonAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)

我在组之间划分并相应地设置字段.如果来自两个组的用户没有同时登录,一切正常!在"只读"用户登录后,adminuser也将只读取所有字段.

我的检查也提供了一个解决方案:如果我在for block中为adminuser添加了一个额外的if语句,一切都按预期工作.

if str(group) == 'adminuser':
    self.readonly_fields = PersonAdmin.readonly_fields
Run Code Online (Sandbox Code Playgroud)

为什么那样以及那里发生了什么?

我没有进行特殊的缓存设置,它发生在开发服务器以及带有WSGI的Apache上.

根据我的理解,request.user.groups.all()应该返回当前登录用户所属的所有组.Django从哪里获得allfields(readonly),如果另一个用户在不同的IP和会话上匹配这个if块?

python django django-admin

3
推荐指数
1
解决办法
8156
查看次数