2016-03-16 4 views
3

У меня есть попытка реализовать пользователей на веб-сайте, над которым я работаю. Возможно, это не очень хороший метод, поскольку я новичок в django; что я до сих пор является простой проверкой шаблона, чтобы обеспечить различные ссылки для разных людей:Django ограничивает страницы определенным пользователям

{% extends 'base.htm' %} 
{% block content %} 
    {% if user.username == 'user1' %} 
    <p>User 1 Downloads</p> 
    {% elif user.username == 'user2' %} 
    <p>User 2 Downloads</p> 
    {% else %} 
    <p>There are no Downloads for this User</p> 
    {% endif %} 
{% endblock %} 

Это новый сайт для моей компании, и я ожидаю, чтобы, может быть, 20 пользователей на наиболее и в то время как я мог бы, если/случай через них, вероятно, есть лучший способ сделать это. Кроме того, я хотел бы иметь возможность, например: user1 to user5 иметь доступ к загрузке 1, user6 to user10 имеет доступ к загрузке 2 и т. Д. Является ли это уже учтено в django, что я могу реализовать или мне нужно сделать свою собственную таблицу пользователей с столбцом «доступ» с идентификатором, который будет использоваться для того, что они могут видеть, вместо использования имени пользователя?

+1

В нашем проекте мы использовали 'django.contrib.auth' и назначили пользователей для групп для фильтрации содержимого, которое им было разрешено видеть. –

+0

Поместите загружаемые файлы в таблицу и добавьте в эту таблицу поле пользователя, чтобы вы могли просто загружать все файлы с помощью пользователя == logged_user –

+0

@ChuckLoganLim Я читал о группах, но у меня возникли проблемы с поиском того, как я буду делать и используя группу. –

ответ

3

В идеале вы хотите оставить эту логику вне шаблона. Рассчитайте URL-адрес загрузки в представлении и передайте его в шаблон. Тогда ваш шаблон упрощает что-то вроде:

{% if download_url %}<a href="{{ download_url }}">Download</a>{% else %}No downloads{% endif %} 

По вашему мнению, вы можете начать с, если/Элиф заявление для определения URL загрузки.

def get_download_url(self): 
    if user.username == 'user1': 
     download_url = '/downloads/user1/' 
    elif user.username == 'user2': 
     download_url = '/downloads/user2/' 
    else: 
     download_url = None 

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

def get_download_url(user): 
    download_urls = { 
     'user1': '/downloads/user1/', 
     'user2': '/downloads/user2/', 
    } 
    return download_urls.get(user.username) 

В конечном счете, вы можете захотеть сохранить информацию в базе данных. Обратите внимание, что вам не нужен пользователь. Вам просто нужны модели с внешним ключом/от одного до одного/многие к многим полям, которые ссылаются на пользователя.

class Download(models.Model): 
    user = models.OneToOneField('auth.User') # one to one field limits to one download url per user 
    download_url = models.CharField() 

Тогда в представлении:

def get_download_url(user): 
    try: 
     download = Download.objects.get(user=user) 
     return download.download_url 
    except Download.DoesNotExist: 
     return None 

Я уверен, что все эти фрагменты могут быть улучшена или переделан в соответствии с вашим использованием лучше. Главное, что вам будет легче получить правильную логику, если вы используете Python вместо языка шаблона Django.

+0

есть ли что-нибудь, что вы могли бы рассказать о том, как я вычислил URL-адрес загрузки? Это похоже на лучший метод и будет содержать мой html маленький. –

+0

Я добавил несколько предложений, чтобы вы начали. – Alasdair

1

Ваш подход будет довольно быстро падать, если пользователь изменит свое имя (например, женится/разведен/фанк). Что лучше было бы обеспечить отношение «многие ко многим» между моделью загрузки и пользователь, то вы можете просто перебирать их в своем шаблоне, чтобы получить все загрузки, доступные конкретному пользователю.

Смежные вопросы