私は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
最初に既存の登録ユーザーから参加者を選択し、そこで見つからない場合は、新しい「オフライン」参加者をインラインで追加できるようにしたいと考えています。これを達成するための最良の方法は何ですか?
- から継承する 2 つのプロファイルがあります
UserProfile
か? - オフライン ユーザー用の別のモデルと、
Trip
? - もっと良い方法はありますか?
Heddeのコメントの後に編集します。
OfflineUser
GenericRelation で提案されているように作成しました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回行う必要がありますか?