相关疑难解决方法(0)

如何在Django ModelForm中过滤ForeignKey选项?

说我的我有以下内容models.py:

class Company(models.Model):
   name = ...

class Rate(models.Model):
   company = models.ForeignKey(Company)
   name = ...

class Client(models.Model):
   name = ...
   company = models.ForeignKey(Company)
   base_rate = models.ForeignKey(Rate)
Run Code Online (Sandbox Code Playgroud)

即有多个Companies,每个都有RatesClients.每个都Client应该有一个Rate从它的父级Company's Rates而不是另一个基础中选择的基础Company's Rates.

在创建用于添加a的表单时Client,我想删除Company选项(因为已经通过Company页面上的"添加客户端"按钮Rate选择了该选项)并且还将选择限制为该选项Company.

我如何在Django 1.0中解决这个问题?

我目前的forms.py文件只是样板文件:

from models import *
from django.forms import ModelForm

class ClientForm(ModelForm):
    class Meta:
        model = Client
Run Code Online (Sandbox Code Playgroud)

views.py也是基本的:

from django.shortcuts …
Run Code Online (Sandbox Code Playgroud)

python django django-forms

218
推荐指数
4
解决办法
13万
查看次数

Django:从ModelAdmin中访问模型实例?

我在网上商店应用程序中有一个Orders模型,它有一个自动递增的主键和一个自己的外键,因为订单可以拆分成多个订单,但必须保持与原始订单的关系.

class Order(models.Model):
    ordernumber = models.AutoField(primary_key=True)
    parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
    # .. other fields not relevant here
Run Code Online (Sandbox Code Playgroud)

我已经为管理站点注册了OrderAdmin类.对于详细视图,我已经包含parent_orderfieldsets属性中.当然,默认情况下,它会列出选择框中的所有订单,但这不是所需的行为.相反,对于没有父订单的订单(即未从另一个订单拆分; parent_order是NULL/None),不应显示任何订单.对于已拆分的订单,此应仅显示单个父订单.

有一个相当新的ModelAdmin方法formfield_for_foreignkey,这似乎是完美的,因为查询集可以在其中进行过滤.想象一下,我们正在查看订单#11234的详细视图,该订单已从订单#11208拆分.代码如下

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'parent_order':
        # kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
        return db_field.formfield(**kwargs)
    return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)

注释行在Python shell中运行时返回,返回单项查询集,其中包含#11234的#11208订单以及可能已从中拆分的所有其他订单.

当然,我们不能在那里硬编码订单号.我们需要引用ordernumber订单实例的字段,我们正在查看其详细信息页面.像这样:

kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)
Run Code Online (Sandbox Code Playgroud)

我发现没有办法替换????? 参考"当前"订单实例,我挖得很深.selfinside formfield_for_foreignkey指的是ModelAdmin实例,虽然它确实有一个model属性,但它不是订单模型实例(它是ModelBase引用; self.model()返回一个实例,但它的ordernumber是None).

一个解决方案可能是从request.path(/ admin/orders/order/11234 /)中提取订单号,但这真的很难看.我真的希望有更好的方法.

django modeladmin django-admin

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

在django admin中过滤外键字段

我有这些模型:

class Entity(models.Model):
       name=models.CharField(max_length=100)

class Theme(models.Model):
   name=models.CharField(max_length=100)
   entity=models.OneToOneField(Entity)

class Company(models.Model):
    name=models.CharField(max_length=100)
    theme=models.OneToOneField(Theme,null=True,blank=True)
Run Code Online (Sandbox Code Playgroud)

我想在管理员中添加公司时过滤主题字段,有些事情是这样的:

class CompanyAdmin(admin.ModelAdmin):
   def queryset(self, request):
      qs = super(CompanyAdmin, self).queryset(request)
      qs.theme.queryset = Theme.objects.filter(name__iexact='company')
      return qs

admin.site.register(Company,CompanyAdmin)
Run Code Online (Sandbox Code Playgroud)

我尝试过很多东西,但没有人工作过!我怎么能这样做?

python django

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

标签 统计

django ×3

python ×2

django-admin ×1

django-forms ×1

modeladmin ×1