5

私はTrip、特定の旅行と 1 人の所有者に多くの参加者を登録できるモデルを持っています。参加者はサイトに登録されたユーザーですが、「オフライン」ユーザー、つまりサイトにアカウントを持っていないユーザーを旅行に追加できるようにして、すべてのユーザーが来ることを追跡できるようにしたいと考えています。所有者と参加者は、Userena のユーザー プロファイルにリンクされています (副次的な質問: 直接リンクしたUserほうがよいでしょうか?しかし、どうすれば full_name をインライン管理で選択として表示できますか?)

class Trip(models.Model):
    name = models.CharField('trip name', max_length=200)
    type = models.ForeignKey(Category, related_name='categories')
    .
    .
    .
    slug = models.SlugField('trip slug', max_length=100)
    owner = models.ForeignKey(UserProfile, related_name='owner')
    participants = models.ManyToManyField(UserProfile, blank=True, null=True, related_name='participants')
    is_public = models.BooleanField("is visible?",db_index=True)

class ParticipationInline(admin.TabularInline):
    model = Trip.participants.through
    extra = 3

class TripAdmin(admin.ModelAdmin):

    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name in ('desc',):
            return db_field.formfield(widget=TinyMCE(
                attrs={'cols': 100, 'rows': 20},
                mce_attrs={'external_link_list_url': reverse('tinymce.views.flatpages_link_list')},
            ))
        return super(TripAdmin, self).formfield_for_dbfield(db_field, **kwargs)
    inlines = [
        ParticipationInline,
        ]
    exclude = ('participants',)
    prepopulated_fields = {"slug": ("name",)}
    list_display = ('name', 'type', 'date', 'dest','owner', 'is_public')
    list_filter = ['date', 'type']
    search_fields = ['name', 'dest', 'desc']
    date_hierarchy = 'date'

    class Media:
        js = ('js/tiny_mce/tiny_mce.js',
              'js/tiny_mce/textareas.js',)


admin.site.register(Trip, TripAdmin)

したがって、管理者インターフェイスを介して追加するときは、Trip最初に既存の登録ユーザーから参加者を選択し、そこで見つからない場合は、新しい「オフライン」参加者をインラインで追加できるようにしたいと考えています。これを達成するための最良の方法は何ですか?

  1. から継承する 2 つのプロファイルがありますUserProfileか?
  2. オフライン ユーザー用の別のモデルと、Trip?
  3. もっと良い方法はありますか?

Heddeのコメントの後に編集します。

OfflineUserGenericRelation で提案されているように作成しましたTrip

class OfflineUser(models.Model):
    first_name = models.CharField(_('first'), max_length=30)
    last_name = models.CharField(_('last'), max_length=30)
    ...
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey("content_type", "object_id")    

class Trip(models.Model):
    ...
    owner = models.ForeignKey(UserProfile, related_name='owner')
    participants = models.ManyToManyField(UserProfile, blank=True, null=True, related_name='participants')
    offline_users = generic.GenericRelation(OfflineUser)

追加した後、OfflineUserInline登録ユーザーとオフライン ユーザーを私のTrip! Trip次に、次のように両方のタイプの参加者を一覧表示できます。

{% if request.user.is_staff %}
        <ul>
            {% for participants in object.participants.all %}
                <li> {{ participants.full_name }}
                </li>
            {% empty %}
                No registered users!
            {% endfor %}
            {% for participants in object.offline_users.all %}
                <li> {{ participants.full_name }}
                </li>
            {% empty %}
                No offline users!
            {% endfor %}
        </ul>
{% endif %}

それで、それはある程度機能しますが、今では、Heddeの答えを完全には理解していなかったという奇妙な感覚があります...

参加者と何かをしたいときはいつでも(数えたり、リストしたり)、それを2回行う必要がありますか?

4

1 に答える 1

1

contenttypes フレームワークを使用すると、これが簡単になります。必要に応じて、管理者からコンテンツ タイプをフィルタリング/非表示にしたり、フォームをクリーンアップしたり、保存を上書きしたりできます。「オフライン」の参加者の場合、私はプロファイルを作成しませんが、模倣します。

class OfflineUser(models.Model):
    first_name = models.CharField(_('first name'), max_length=30)
    last_name = models.CharField(_('last name'), max_length=30)
    email = models.EmailField(_('e-mail address'))
    # field extensions
    ... = generic.GenericRelation(...)

    def get_profile(self):
        pass

    def get_full_name(self):
        """
        Add some default User methods so you can call them on
        the related_object without raising attribute errors
        """
        full_name = u'%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

次のようなことができるようになりました。

{{ some_model.content_object.get_profile.get_full_name }}

あなたを助けるためのstackoverflowとgoogleの結果がたくさんあります。

一般的な多対多の関係

于 2012-11-17T11:31:17.157 に答える