1

Django admin でのユーザー入力を容易にするために django-ajax-selects を使用しています。具体的には、「スルー」モデルがインライン化されている多対多の関係で:

models.py

class Part(models.Model):
    item_code = models.CharField(max_length=100, primary_key=True)
    name = models.CharField('Part Name', max_length=128)

    def __unicode__(self):
        return self.item_code


class Service(models.Model):
    parts = models.ManyToManyField(Part, through='ServicePart')

class ServicePart(models.Model):
    STATE_CHOICES = (
        ('N', 'New'),
        ('U', 'Used'),
    )
    service = models.ForeignKey(Service)
    part = models.ForeignKey(Part)

    cost = models.DecimalField ...
    state = models.CharField(max_length=1, choices=STATE_CHOICES)

admin.py

class ServicePartInline(AjaxSelectAdminTabularInline):

    model = ServicePart

    form = make_ajax_form(ServicePart, {
            #item_code is a lookup channel
            'part': 'item_code', 
             },
           show_help_text=True)

    extra = 2

class ServiceAdmin(admin.ModelAdmin):
    inlines = [ServicePartInline,]

lookups.py

class PartLookup(LookupChannel):

    model = Part

    def get_query(self, q, request):
        return Part.objects.filter(Q(item_code__icontains=q) | Q(name__istartswith=q)).order_by('name')

    def get_result(self, obj):
        return obj.name

    def format_match(self, obj):
        return u"%s<div><i>%s</i></dev>" % (escape(obj.item_code), escape(obj.name))

    def format_item_desplay(self, obj):
        return u"%s<div><i>%s</i></dev>" % (escape(obj.item_code), escape(obj.name))

設定.py

AJAX_LOOKUP_CHANNELS = {
    'item_code': ('appname.lookups', 'PartLookup'),
}

これで、保存を押すまで、すべてが正常に機能します (サービス管理内の多くの部分を選択)。次の例外が発生します。

0x7f28742e5fd0 の appname.lookups.PartLookup オブジェクト > オブジェクトが見つかりません: 6965933

6965933 は、サービス管理内で選択した部分のコードです...

この例外の原因がわかりません。

あなたの助けに感謝します

4

1 に答える 1

0

この問題は、Part モデルが主キーとして自動 ID を持たないことが原因であることが判明しました。データベースを変更して自動主キーを追加し、 item_code を一意で主キーではないように変更すると、問題は解決しました。

上記の後、新しく追加された id ではなく item_code を使用してリレーションが参照されたため、Part モデルとリレーションを持つモデルに注意する必要があります。

于 2013-12-03T15:08:54.060 に答える