2012-10-11 43 views
0

我正在嘗試向用戶帳戶添加首選項。每個首選項都是真/假值,它需要保持這種方式。如何訪問在Django模型中保存爲布爾字段的用戶首選項?

由於每個帳戶可能有多個首選項,我想知道如何在我的模板中遍歷它們並讓這些首選項在整個應用程序中輕鬆可用。

Ex。我想顯示用戶的名字和他們喜歡的所有顏色。

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 

回答

1

更新:

在我最初的答案中,我嘗試重構數據並保持值爲布爾值。看起來我們需要更接近原始結構。

您可以循環訪問UserColors模型中的字段。這是在視圖代碼更容易,因爲你需要getattr的:

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) 

然後在每個用戶上點一個你想要的每種顏色註明:

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 %} 
+0

我喜歡你的建議,但正如我在我的問題提到我必須保持顏色布爾字段。 – howtodothis

+0

@Terra使用更接近原始代碼的解決方案進行更新。 – dokkaebi

相關問題