2011-04-12 52 views
0

我正在嘗試爲學習目的構建一種新聞網站。幫助概念和數據庫查詢問題(Django/Python)

class NewsCategory(models.Model): 
    category = models.CharField(max_length=50) 

注:一個類別可以是足球,網球,商業......用戶可以註冊到不同的新聞類別。這一選擇將保存在他們的偏好中。

class Profile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    gender = models.CharField(max_length=1,blank=True) 
    preference = models.ManyToManyField(NewsCategory) 

我目前停留在如何更新每個用戶的喜好列表

觀點(即指定哪些類別,他感興趣的列表。):

category = [(item.category) for item in NewsCategory.objects.all()] 

然後我將category發送到以下模板

templa TE:

<div id="c_b"> 
    {% for c in category %} 
     <input type="checkbox" name="category[]" value="{{c}}"> 
     <label for="{{c}}">{{c}}</label> 
    {% endfor %} 
</div> 

的問題:那些已經保存在用戶的喜好,當我顯示模板複選框

  1. 什麼是添加檢查的標籤的最佳途徑下一步。

    我雖然讓所有用戶都註冊喜好的:saved_preference = user.preference.all(),然後在category檢查每個項目,如果它是在saved_preference

    我也是在路上消隱實際編寫成代碼,和無論這是應該在視圖還是模板中完成。

  2. 什麼是更新用戶偏好列表的好方法?

    我打算運行user.preference.clear()然後通過每個項目在提交的表單會運行user.preference.add(the_new_preference)

回答

1

您需要將完整的類別列表以及用戶選定類別的索引傳遞給模板。你不需要到NewsCategory查詢集轉換成一個列表視圖,順便說一句:

查看

categories = NewsCategory.objects.all() 
user_preferences = [item.id for item in Profile.preference.all()] 

user_preferences變量將作爲我們的模板查找索引。

然後你遍歷在模板上的所有類別,並檢查它是否在用戶首選項的列表中存在:

模板

<div id="c_b"> 
{% for c in categories %} 
    <input type="checkbox" name="category[]" id="id_{{ c.category }}" value="{{ c.id }}" {% if c.id in user_preferences %}checked="checked"{% endif %} /> 
    <label for="id_{{ c.id }}">{{ c.category }}</label> 
{% endfor %} 
</div> 

更新 - 保存用戶的喜好

這裏沒有硬性規定。就我而言,主要的考慮是將數據庫命中率降至最低。您可以像您說的那樣清除用戶首選項,然後添加新的用戶首選項 - 事實上,這就是Django的管理員處理它的方式。只要利用Django的交易管理:

from django.db import transaction 

@transaction.commit_manually 
def add_preferences(user, preferences): 
    user.preference.clear() 
    for pref in preferences: 
    user.preference.add(pref) 
    transaction.commit() 
+0

我認爲這非常解決了我的第一個問題! quick html澄清:在標籤中,你的意思是寫'for =「id _ {{c.category}}'而不是'for =」id _ {{c.id}}「'你認爲這是一個好方法要清除列表,然後在每次提交表單時都更新它?我建議這樣做,因爲我不認爲有一個直接的方法可以知道用戶是否刪除/添加了一個首選項(或兩者兼有)。 – 2011-04-12 13:34:33

+0

對不起,錯字。這就是我的意思,是的,重新更新偏好設置,我會在我的答案中添加更新。 – 2011-04-12 13:40:23

0

你應該瞭解在Django的形式和模型的形式。這將是增加和改變的最佳方式。表格將爲您做最多的工作。

+0

我可以看到一個表單將如何幫助我添加一個NewsCategory條目或一個用戶實例。然而,我沒有看到如何將許多有用的字段合併到表單中,或者用於編輯用戶的偏好列表。 – 2011-04-12 13:06:51

+0

profile = user.get_profile()#即 form = ProfileForm(instance = profile)#從現有配置文件創建的模型表單。 默認情況下,ManyToMany字段將顯示爲多選。 – 2011-04-12 13:12:03