2

models.py

TITLE = (
    ('Classroom', 'Classroom'),
    ('Playground', 'Playground'),
    ('Staff Room','Staff Room'),
)

class Location(models.Model):
    user = models.ForeignKey(User,null=True)
    title = models.CharField('Incident Type', max_length=200,default=TITLE)
    parent_location_id = models.CharField('Parent Location', max_length=100, null=True, blank=True)
    is_active = models.BooleanField('Is Active', default=True)

def location_title(sender, instance, created, **kwargs):        
    if instance.is_superuser and not instance.location.is_active:

        instance.location.is_active=True
        instance.location.save()

post_save.connect(location_title, sender=User)

特定の条件でデフォルトのデータをデータベースに挿入したい.これは、manage.py createsuperuserコメントを介してスーパーユーザーを作成するときに発生するはずです.

djangoで可能かどうかはわかりませんが、要件です。上記のコードで試しました。スーパーユーザーの作成中に「AttributeError: 'User' object has no attribute 'location'」というエラーが表示されます。

私が必要としたサンプルを以下に示します

サンプル出力

4

2 に答える 2

4

この関数をシグナルハンドラとして試してください:

def location_title(sender, instance, created, **kwargs):
    # Don't fire up on updates.
    if not created:
        return

    # Only handle new superusers.
    if not instance.is_superuser or not instance.is_active:
        return

    # Create a `Location` entry for new superuser.
    l = Location(user_id=instance.pk)
    l.save()

post_save.connect(location_title, sender=User)

モデル フィールドへの選択肢の追加:

Django CharField には名前付き引数choicesがあり、エンドユーザーに可能な値のリストを提供し、フォームでそれらを適切に検証できます。iterable の形式は次のとおり<internal_value>, <display_value>です。フィールドにchoices引数が渡されると、メソッドを使用して内部値に接続された表示値にアクセスできますinstance.get_<field_name>_display()

反復可能な選択肢は次のようになります。

class Location(models.Model):
    class Title:
        CLASSROOM = 'classroom'
        PLAYGROUND = 'playground'
        STAFF_ROOM = 'staff_room'

    TITLE_CHOICES = (
        (Title.CLASSROOM, 'Classroom'),
        (Title.PLAYGROUND, 'Playground'),
        (Title.STAFF_ROOM, 'Staff Room'),
    )

    user = models.ForeignKey(User,null=True)
    title = models.CharField('Incident Type', max_length=200,choices=TITLE_CHOICES,default=Title.CLASSROOM)
    parent_location_id = models.CharField('Parent Location', max_length=100, null=True, blank=True)
    is_active = models.BooleanField('Is Active', default=True)

最終的な解決策は次のとおりです。

class Location(models.Model):
    class Title:
        CLASSROOM = 'classroom'
        PLAYGROUND = 'playground'
        STAFF_ROOM = 'staff_room'

    BASE_LOCATION = Title.CLASSROOM

    TITLE_CHOICES = (
        (Title.CLASSROOM, 'Classroom'),
        (Title.PLAYGROUND, 'Playground'),
        (Title.STAFF_ROOM, 'Staff Room'),
    )

    user = models.ForeignKey(User,null=True)
    title = models.CharField('Incident Type', max_length=200,choices=TITLE_CHOICES,default=Title.CLASSROOM)
    parent_location_id = models.CharField('Parent Location', max_length=100, null=True, blank=True)
    is_active = models.BooleanField('Is Active', default=True)


def location_title(sender, instance, created, **kwargs):
    # Don't fire up on updates.
    if not created:
        return

    # Only handle new superusers.
    if not instance.is_superuser or not instance.is_active:
        return

    # Create a `Location` entry for new superuser.
    base = Location(user_id=instance.pk, title=Location.BASE_LOCATION)
    base.save()

    for value, _ in Location.TITLE_CHOICES:
        if value == Location.BASE_LOCATION:
            continue

        l = Location(user_id=instance.pk, title=value, parent_location_id=base.pk)
        l.save()

post_save.connect(location_title, sender=User)
于 2013-07-28T10:18:17.200 に答える
3

locationユーザーまたはスーパーユーザーを作成すると、モデル インスタンスが作成されますが、対応する行がありません。したがって、アクセスするinstance.location.is_activeとエラーが発生します。

シグナル ハンドラーを更新して、location最初にインスタンスを作成し、次に適切な属性を設定できます。以下のように:

def location_title(sender, instance, created, **kwargs):     
    #also check for created flag   
    if created and instance.is_superuser:
        location = Location(user=instance)
        location.is_active=True
        location.save()

post_save.connect(location_title, sender=User)

フィールドの選択肢が必要な場合は、titleフィールドでそれを定義できます。フィールドの定義がtitle正しくありません。次のように変更してください

title = models.CharField('Incident Type', max_length=200, choices=TITLE,  
                         default='Classroom') 

detfault=TITLEの代わりに間違って使用していchoices=TITLEます。

于 2013-07-28T16:21:26.270 に答える