0

ユーザーアカウントに設定を追加しようとしています。各プリファレンスはtrue/false値であり、このままである必要があります。

各アカウントには複数の設定がある可能性があるため、テンプレートでそれらをループする方法を知り、それらの設定をアプリ全体で簡単に利用できるようにします。

元。ユーザーの名前と好きな色をすべて表示したい。

models.py

class UserColors(models.Model):
    white = models.BooleanField(_("White"))
    black = models.BooleanField(_("Black"))

class Account(models.Model):
    user = models.OneToOneField(User, unique=True, verbose_name='user', related_name='account')
    colors = models.ForeignKey('UserColors', null=True)

views.py

class UserView(DetailView):
    context_object_name = 'account'
    template_name = 'detail.html'

    def get_object(self, queryset=None):
        return self.request.user

template.html

user: {% account.user.username %} <br>
colors: 

# the following would be ideal instead of doing multiple ifs in search for true/false values
{% for color in account.colors %}
    color.name
{% endif %}

出力

user: userName
colors: white, black
4

1 に答える 1

1

アップデート:

私の元の答えでは、データを再構築し、値をブール値として維持しようとしました。元の構造に近づける必要があるようです。

UserColorsモデルのフィールドをループできます。getattrが必要なため、Viewコードの方が簡単です。

def get_context_data(self, request, *args, **kwargs):
    data = super(UserView, self).get_context_data(request, *args, **kwargs)
    acct = data['account'] # Guessing this is here based on your posted template code
    colors = {}
    for field in acct.colors._meta.fields:
        colors[field.name] = getattr(acct.colors, field.name, False)
    data['usercolors'] = colors
    return data

次に、テンプレートで:

{% for k,v in usercolors.items() %}
   {% if v %}
   {{ k }}
   {% endif %}
{% endfor %}

元の答え:

次のように構成できます。

class UserColor(models.Model):
    colors = {
        "WHITE": "WHT",
        "BLACK": "BLK",
    }

    color_choices = (
        (colors['WHITE'], "White"),
        (colors['BLACK'], "Black"),
    )

    name = models.CharField(_("Color Name"), max_length=3, choices=color_choices)
    value = models.BooleanField(_("Whether they like it"))
    user = models.ForeignKey(User)

次に、指定する色ごとに各ユーザーに1つずつポイントします。

user = User.objects.get(name="me")
white = UserColor.objects.create(
    color=UserColor.colors['WHITE'], value=False, user=user)
black = UserColor.objects.create(
    color=UserColor.colors['BLACK'], value=True, user=user)

次のように使用します。

{% for color in user.color_set.all() %}
  {{ color.name }}: {{ color.value }}
{% endfor %}
于 2012-10-11T16:49:43.833 に答える