Помощь в концепции и вопрос вопрос базы данных (Django / Python) - PullRequest
0 голосов
/ 12 апреля 2011

Я пытаюсь создать своего рода новостной сайт для учебных целей.

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 по шаблону ниже

шаблон:

<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)

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Вам нужно будет передать полный список категорий, а также индекс выбранных пользователем категорий в ваш шаблон.Вам не нужно преобразовывать набор запросов NewsCategory в список в вашем представлении, например:

View

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 голосов
/ 12 апреля 2011

Вы должны узнать о формах и модельных формах в Django.Это был бы лучший способ для добавления и изменения.Формы сделают большую часть работы за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...