在django模型表单中选择未选择的m2m实例

时间:2014-07-30 09:24:40

标签: python django many-to-many

我有一个发票主模型及其管理员。在发票明细(内联)中,我希望从产品表中选择不同的产品,即在每个发票明细中,我不应该允许选择之前选择的产品。我可以获得它的示例代码吗?关系定义: models.py:

class InvoiceHeader(models.Model): #model
    number ....

class InvoiceDetail(models.Model):
   header = models.ForeignKey(InvoiceHeader)
   products = models.ManyToManyField(Product,related_field="products")

admin.py:

class InvoiceDetailForm(forms.ModelForm):
    form = InvoiceDetailForm   
    def __init__(self, *args, **kwargs):
        super(InvoiceDetailForm, self).__init__(*args, **kwargs)
            # Below statement to be changed: 
            self.fields['products'].queryset = Product.objects.exclude(
                 name__exact=self.instance.invoicedetail.products.all()


    class  InvoiceDetailInline(admin.StackedInline): 
        extra = 1 
        class Meta:
           model = InvoiceDetail

    class InvoiceHeaderAdmin(admin.ModelAdmin):
           class Meta:
                model = InvoiceHeader
           inlines = ['InvoceDetailInline']    

仅使用django 1.6 当我在InvoiceDetailInline中选择产品A时,在其下一个内联表单中,我不能选择产品A.应该允许选择产品B. 我可以在这个场景中使用一些javascript或jquery。我需要完整的详细资料,因为我不擅长。请尽快恢复并强制

1 个答案:

答案 0 :(得分:0)

第一个答案是错误的,因为我误解了你的问题。我花时间分析你的问题,并提出了这些文件:

<强> models.py

from django.db import models


class Product(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def __str__(self):
        return self.name


class InvoiceHeader(models.Model):
    number = models.IntegerField(unique=True)

    def __str__(self):
        return str(self.number)


class InvoiceDetail(models.Model):
    header = models.ForeignKey(InvoiceHeader, related_name='invoicedetail')
    products = models.ManyToManyField(
        Product,
        related_name='invoicedetail')

    def __str__(self):
        return '{0}, {1}'.format(self.header, self.products.all())

<强> admin.py

from django.contrib import admin
from django.forms import ModelForm

from invoice.models import Product
from invoice.models import InvoiceHeader
from invoice.models import InvoiceDetail


class ProductAdmin(admin.ModelAdmin):
    model = Product


class InvoiceDetailAdmin(admin.ModelAdmin):
    model = InvoiceDetail


class InvoiceDetailInline(admin.StackedInline):
    model = InvoiceDetail
    extra = 1


class InvoiceHeaderAdmin(admin.ModelAdmin):
    model = InvoiceHeader
    inlines = [InvoiceDetailInline]


admin.site.register(Product, ProductAdmin)
admin.site.register(InvoiceDetail, InvoiceDetailAdmin)
admin.site.register(InvoiceHeader, InvoiceHeaderAdmin)

我试图在我看来填补缺失的部分。如果您尝试这些文件,则可以在管理区域中添加InvoiceHeader,并为InvoiceDetail添加内联选择框。您可以按&#34;添加另一个发票明细&#34;用于另一个内联选择框等。在这里,您不希望为同一发票标题号选择相同的产品。我理解你了吗?

我们假设您有以下发票标题:

  • 12345
  • 23456
  • 34567

以及以下产品:

  • 键盘
  • 小鼠
  • 扬声器
  • 耳机
  • 网络摄像头

您可以制作以下发票明细:

  • 12345,键盘,鼠标
  • 12345,发言者
  • 23456,扬声器,耳机,网络摄像头
  • 34567,键盘,鼠标
  • 34567,耳机,网络摄像头

但不应该有以下内容:

  • 12345,键盘,鼠标
  • 12345,键盘,扬声器//已选择键盘
  • 23456,发言者
  • 23456,鼠标,扬声器//已选择扬声器

我希望我的假设是正确的。

因此,在管理区域的内联选择框中,您仍然可以选择产品,但您可以编写自己的验证规则,以防止保存。

也许我可以给你一些进一步的建议。如果你能确认我的例子适合到目前为止会很好。