Введение
Я немного новичок в django
и python
и, чтобы научиться этому должным образом, я решил начать свой первый немного более сложный проект. Короче говоря, мне нужен совет / помощь, если я думаю в правильном направлении.
Описание приложения
Все приложение относится к странице, где пользователи могут выбрать шаблон page
и самостоятельно изменить содержание страницы.
Архитектура
Я решил, что каждый template
(вид страницы пользователя) будет отдельным django app
. Я создал простое приложение mgmt
для управления обычными вещами a.k.a User
расширение профиля и т. Д.
Требования
- Пользователи не могут изменять / просматривать каждый другой элемент одного и того же шаблона
- Ссылка на страницу пользователя должна выглядеть как
mysite.tld/user
Решение
Решение, которое я принял:
urls.py настройка
проект urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('jet/', include('jet.urls', 'jet')), # Django JET URLS
path('<username>/',include('mgmt.urls','mgmt')),]
шаблон urls.py
urlpatterns = [
path('<username>/', views.index, name='index'),]
mgmt app urls.py
urlpatterns = [
path('', views.route, name='route'),]
mgmt.route
def route(request, username):
u = User.objects.get(username=username)
templRender = __import__(u.profile.template+'.views', fromlist=[u.profile.template])
return templRender.index(request, username)
Вопрос1: Как лучше обойти это решение?
настройка интерфейса администратора
Я решил проблему с правами с помощью следующих методов
def has_view_permission(self,request, obj=None):
if obj is not None and obj.created_by != request.user:
print(obj.created_by)
return False
return True
def has_delete_permission(self,request, obj=None):
if obj is not None and obj.created_by != request.user:
return False
return True
def has_change_permission(self,request, obj=None):
if obj is not None and obj.created_by != request.user:
return False
return True
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(created_by=request.user)
def save_model(self, request, instance, form, change):
instance = form.save(commit = False)
if not change or not instance.created_by:
instance.created_by = request.user
instance.save()
form.save_m2m()
return instance
Вопрос2: Есть ли другой способ решить такое ограничение?
Спасибо за любые советы или подсказки.
Y