1

その特定のイベントの出席者を作成する登録ボタンがあります(機能します)。ただし、[登録] をクリックすると、テンプレート'is_attending'= Trueは のすべてのイベントに対して (登録済み!) を認識しupcomingます。

意見:

def index(request):
    upcoming = Event.objects.filter(date__gte=datetime.now())
    if request.user.is_authenticated():
        profile = Profile.objects.get(user=request.user)
    is_attending = False
    for event in upcoming:
        attendees = [a.profile for a in Attendee.objects.filter(event=event)]
        if profile in attendees:
            is_attending = True

テンプレート

{% if is_attending %}
     <a><Registered!</a>
{% else %}
     <form>... registration form ... Register Now...

私は何が起こっていると思います:

event 1  : Registered!
event 2  : Registered!
event 3  : Registered!

私が必要とするのは:

event 1  : Registered!
event 2  : Register Now
event 3  : Register Now

なぜこれがうまくいかないのかよくわかりませんか?イベントis_attendingに登録した人だけに戻るにはどうすればよいですか?upcoming

モデル:

class Attendee(models.Model):
    event = models.ForeignKey(Event)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    profile = generic.GenericForeignKey('content_type', 'object_id')
4

1 に答える 1

1

is_attendingfor ループを通過するたびに の値を上書きして います。テンプレートは、is_attendingの最後のイベントにupcomingが参加しているかどうかによって設定された の (単一の) 値を認識しますrequest.user

目的の動作を得るにはis_attending Event. これを行う最も簡単な方法は、カスタム テンプレート タグを使用することだと思います。

@register.simple_tag(takes_context=True)
def user_is_attending(context, event):
    if type(event) != Event:
        raise template.TemplateSyntaxError("Must provide event")
    request = context['request']
    if event.attendee_set.filter(profile__user=request.user).exists():
        return 'attending'
    else:
        return 'not attending'

次に、テンプレートでイベントをループしている間に、次のようにします。

{% user_is_attending event %}

必要に応じて、割り当てタグまたは包含タグの使用を検討することもできます。

于 2012-08-13T20:15:25.000 に答える