9

私はdjando 1.5で定義された次のモデルと管理者を持っています。これは、サブネットと VLAN の間の多対多の関係です。ManyToMany フィールドで related_name オプションを使用して、関連するサブネット オブジェクトから vlan のコレクションを取得できるようにします。管理者から VLAN にサブネットを追加するとうまくいきます。ただし、vlan セットに van を追加するためにサブネット admin に horizo​​ntal_filer を追加しようとすると、vlans 属性が存在しないというエラーが表示されます。一部のビューでサブネット オブジェクトを使用しており、vlans 属性に正しくアクセスできます。

ここで何が間違っていますか?同様の投稿を見たことがありますが、提案されたソリューションをうまく適応させることができませんでした。

ご協力いただきありがとうございます

model.py

from django.db import models

class Subnet(models.Model):
    networkAddress = models.CharField(max_length=15)
    size = models.IntegerField()

    def __unicode__(self):
        return "%s/%s" % (self.networkAddress, self.size)

class IpAddress(models.Model):
    ipAddress = models.CharField(max_length=15)
    subnet = models.ForeignKey(Subnet)

    def __unicode__(self):
        return "%s" % (self.ipAddress)

class Vlan(models.Model):
    number = models.IntegerField()
    description = models.CharField(max_length=150)
    subnets = models.ManyToManyField(Subnet, related_name='vlans', blank=True)

    def __unicode__(self):
        return "VLAN %s (%s)" % (self.number, self.description)

admin.py

from network.models import Subnet, IpAddress, Vlan
from django.contrib import admin

class SubnetAdmin(admin.ModelAdmin):
    filter_horizontal = ('vlans',)

admin.site.register(Subnet, SubnetAdmin)
admin.site.register(IpAddress)
admin.site.register(Vlan)

そして私が得るエラー

Request Method:     GET
Request URL:    http://127.0.0.1:8000/admin/
Django Version:     1.5.2
Exception Type:     ImproperlyConfigured
Exception Value:    

'SubnetAdmin.filter_horizontal' refers to field 'vlans' that is missing from model 'network.Subnet'.
4

2 に答える 2

10

どうやらこれは8 年前の機能リクエストです。django-admin-extendがあります。または、次のようなものをそこに投げることもできます:

from django.contrib import admin as admin_module

class SiteForm(ModelForm):
    user_profiles = forms.ModelMultipleChoiceField(
        label='Users granted access',
        queryset=UserProfile.objects.all(),
        required=False,
        help_text='Admin users (who can access everything) not listed separately',
        widget=admin_module.widgets.FilteredSelectMultiple('user profiles', False))

class SiteAdmin(admin_module.ModelAdmin):
    fields = ('user_profiles',)

    def save_model(self, request, obj, form, change):
        # save without m2m field (can't save them until obj has id)
        super(SiteAdmin, self).save_model(request, obj, form, change) 
        # if that worked, deal with m2m field
        obj.user_profiles.clear()
        for user_profile in form.cleaned_data['user_profiles']:
             obj.user_profiles.add(user_profile)

    def get_form(self, request, obj=None, **kwargs):
        if obj:
            self.form.base_fields['user_profiles'].initial = [ o.pk for o in obj.userprofile_set.all() ]
        else:
            self.form.base_fields['user_profiles'].initial = []
        return super(SiteAdmin, self).get_form(request, obj, **kwargs)

タプルfilter_horizontalで指定すると、 が返されます。fields

于 2013-09-10T15:15:11.007 に答える