Это общий подход, который я беру:
Создание моделей, которые принадлежат пользователю
- На модели имеют внешний ключ к пользователю.
- Определите пользовательский ModelForm, который требует, чтобы пользователь был передан конструктору (
__init__()
). Кроме того, переопределите метод формы save()
, чтобы пользователь, переданный конструктору, был добавлен в экземпляр модели, прежде чем он будет сохранен.
- Определить классические представления на основе
CreateView
и т. Д., Которые переопределяют метод get_form_kwargs
для передачи формы, сохраненной пользователем в запросе.
Вот код:
# models.py
from django.db import models
from django.contrib.auth.models import User
class MyModel(models.Model):
"A model that belongs to a user."
user = models.ForeignKey(User)
# forms.py
from django import forms
from .models import MyModel
class MyModelForm(forms.ModelForm):
"""A form for creating/updating MyModels that accepts
the user as a kwarg.
"""
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(MyModelForm, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs):
self.instance.user = self.user
return super(MyModelForm, self).save(*args, **kwargs)
class Meta:
model = MyModel
# Don't show the user on the form
exclude = ('user',)
# views.py
from django.views.generic import CreateView
from .models import MyModel
from .forms import MyModelForm
class MyModelCreateView(CreateView):
"View for creating a MyModel belonging to the current user."
model = MyModel
form_class = MyModelForm
def get_form_kwargs(self, *args, **kwargs):
form_kwargs = super(MyModelCreateView,
self).get_form_kwargs(*args, **kwargs)
# Pass the current user to the form constructor
form_kwargs['user'] = self.request.user
return form_kwargs
модель Листинге, которые принадлежат пользователю
Это более простым - вы расширяете ListView
и фильтровать QuerySet текущего пользователя. (Read more about ListView
.)
модели редактирования, которые принадлежат пользователю
Используйте подобный подход к MyModelCreateView
, но расширяет UpdateView
вместо этого. Важно здесь, чтобы проверить, есть ли у пользователя разрешения на редактирование:
# views.py
from django.views.generic import UpdateView
from django.core.exceptions import PermissionDenied
...
class MyModelUpdateView(UpdateView):
"View for the current user editing a MyModel."""
model = MyModel
form_class = MyModelForm
def get_object(self, *args, **kwargs):
object = super(MyModelUpdateView, self).get_object(*args, **kwargs)
# Raise a permission denied if the current user doesn't
# 'own' the MyModel they're trying to edit.
if object.user != self.request.user:
raise PermissionDenied
def get_form_kwargs(self, *args, **kwargs):
form_kwargs = super(MyModelCreateView,
self).get_form_kwargs(*args, **kwargs)
# Pass the current user to the form constructor
form_kwargs['user'] = self.request.user
return form_kwargs
A_model_ или _stance model_? Модели эквивалентны таблицам, а экземпляры моделей эквивалентны строкам. Просьба уточнить, что вы спрашиваете. –
«объекты, созданные из этой модели» => экземпляры, правильно? – broinjc