如何解决如何在 Django 内联管理表单中创建过滤下拉列表
我正在寻求根据用户选择向 DJANGO 中的内联表单添加下拉列表。我需要一个 PYTHONIC 解决方案,请不要使用 jquery 或 javascript。
我已经阅读了两种方法。第一个是创建第二个表单并覆盖默认表单集并更改 init 函数。
使用内联 formfield_for_foreignkey 选项的第二种方法。
两者都不起作用,因为我无法获取表单的上下文数据。
用例是我需要抓取表单上的一个字段。然后我希望将该变量用于相关的模型变量。
在此处上传了 OrderItem 管理表单的屏幕截图。
我希望获取订单项上的“产品”行。使用该 PRODUCT 实例,然后我想访问该产品实例的“packaging”变量。
我遇到的问题是上述两个选项都无法轻松访问表单值。
代码如下:
相关模型
class OrderItem(models.Model):
rx_written = models.DateField(default=datetime.date.today)
order = models.ForeignKey(Order,related_name='items',on_delete=models.CASCADE)
product = models.ForeignKey(Product,related_name='order_items',on_delete=models.CASCADE)
doctor = models.ForeignKey(Practitioner,on_delete=models.CASCADE,blank=True,null=True)
pet = models.ForeignKey(Pet,null=True)
price = models.DecimalField(max_digits=10,decimal_places=2,null=True)
tax = models.DecimalField(max_digits=10,null=True)
quantity = models.PositiveIntegerField(default=1,null=True)
tot_cost = models.DecimalField(max_digits=10,null=True)
#shipping_address = models.ForeignKey(ShippingAddress,null=True)
packaging = models.ForeignKey(Sales_Packaging,null=True)
def __str__(self):
return '{}'.format(self.id)
#####override save method #####
def save(self,*args,**kwargs):
self.price = self.product.price
self.tot_cost = self.product.price * self.quantity
super(OrderItem,self).save(*args,**kwargs)
@receiver(post_save,sender=Order)
def set_tot_cost(sender,instance,**kwargs):
for i in instance.items.all():
price = i.product.price
set_tot_cost = i.product.price * i.quantity
tot_tax = set_tot_cost/11
OrderItem.objects.update(price=price,tot_cost=set_tot_cost,tax=tot_tax)
class Product(models.Model):
formula = models.ForeignKey(Formula,related_name='formula',null=True)
category = models.ForeignKey(Category,related_name='products',on_delete=models.CASCADE)
name = models.CharField(max_length=200,db_index=True,null=True,blank=True)
form = models.ForeignKey(Form,blank=True)
target_species = models.ForeignKey(Target_Species,blank=True)
packaging = models.ManyToManyField(Sales_Packaging,blank=True)
slug = models.SlugField(max_length=200,blank=True)
image = models.ImageField(upload_to='product_img/%Y/%m/%d',blank=True)
description = models.TextField(blank=True)
price = models.DecimalField(max_digits=10,blank=True)
tax = models.DecimalField(max_digits=10,default=0)
qty = models.IntegerField(blank=True,default=0)
available = models.BooleanField(default=True)
#compound = models.BooleanField(default=True)
GST = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
#def __str__(self):
# return str("%s (%s)" % (self.name,",".join(Sales_Packaging.short_desc for sales_packaging in self.sales_packagings.all()),))
class Meta:
ordering = ('name',)
index_together = (('id','slug'),)
def get_absolute_url(self):
return reverse('shop:product_detail',args=[self.id,self.slug])
def get_name(self):
for item in self.product_line_set.all():
name = str(item.active) +str(" ")+str(item.strength)+str(" ")+str(item.UoM) + str(qty)+str(" ")++str("in")++str(" ")+str(packaging)
return name
def __str__(self):
return str(self.name)
#####override save method #####
def save(self,**kwargs):
self.slug=slugify(str(self.name)+str(" ")+str(self.form)+str(" ")+str(self.qty)+str(" "))
super(Product,**kwargs)
def __str__(self):
return str(self.name) + str(" ") + str(self.form) + str(" ") + str(self.qty)
管理员选项 A:覆盖新模型表单的初始化
from django import forms
from django.contrib.auth.models import User
from .models import Order,OrderItem
from users.models import Customer
#from localflavor.us.forms import USZipCodeField
from django.forms.models import inlineformset_factory
from Product.models import Product,Sales_Packaging
import logging
class OrderItemInlineForm(forms.ModelForm):
class Meta:
model = OrderItem
exclude = ('pet','doctor',)
extra = 0
def __init__(self,**kwargs):
super().__init__(*args,**kwargs)
logger = logging.getLogger("mylogger")
#qs = OrderItem.objects.get(pk=self.instance)
#logger.info(qs)
self.fields['packaging'].queryset = Sales_Packaging.objects.all()
选项 B formfield_for_foreignkey
class OrderItemInline(admin.TabularInline):
fields = ('rx_written','product','packaging','pet','price','quantity','tax','tot_cost')
model = OrderItem
form = OrderItemInlineForm
extra = 0
def get_formset(self,request,obj=None,**kwargs):
OrderItemInline.obj = obj
return super(OrderItemInline,self).get_formset(request,obj,**kwargs)
def formfield_for_foreignkey(self,db_field,**kwargs):
if db_field.name == "packaging":
try:
kwargs["queryset"] = Sales_Packaging.objects.filter(short_desc__in=['1 box','500ml Tub'])
except IndexError:
pass
return super().formfield_for_foreignkey(db_field,**kwargs)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。