2014-02-19 1 views
4

Я использую django.contrib.auth, и мне интересно, как я могу сделать экземпляр модели «принадлежащей» определенному пользователю. Нужно ли мне определять внешний ключ в модели, который указывает на пользователя? Я хочу, чтобы пользователи сохраняли свой CRUD.Сделать модели принадлежащими пользователям в django

# The objects created from this model should belong 
# to the user who created them and should not be 
# viewable by other users of the website. 

from django.contrib.auth.models import User 

class Classroom(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=30) 
    def __unicode__ (self): 
     return self.name 

Спасибо.

+0

A_model_ или _stance model_? Модели эквивалентны таблицам, а экземпляры моделей эквивалентны строкам. Просьба уточнить, что вы спрашиваете. –

+0

«объекты, созданные из этой модели» => экземпляры, правильно? – broinjc

ответ

2

Если вы хотите, чтобы к объекту принадлежало несколько объектов, объект пользователя foreign key field будет работать. Обратите внимание: вы все равно можете использовать внешний ключ и иметь один экземпляр, передав атрибут unique в определение поля.


Если один объект (и только один) и принадлежат к пользователю, использовать one to one field. Один к одному полю, можно получить доступ с любой стороны модели

Вы можете использовать user.classroom или classroom.user эти переплеты могут быть изменены с атрибутом одного до определения полого related_name.

+0

Итак, поиск объектов, принадлежащих пользователю в представлении, достаточно, чтобы пользователи не видели неправильные объекты? – broinjc

+0

@broinjc Нет, вам нужно самому справиться с этим. –

+0

@BurhanKhalid, как бы я справился с этим? – broinjc

2

Это общий подход, который я беру:

Создание моделей, которые принадлежат пользователю

  1. На модели имеют внешний ключ к пользователю.
  2. Определите пользовательский ModelForm, который требует, чтобы пользователь был передан конструктору (__init__()). Кроме того, переопределите метод формы save(), чтобы пользователь, переданный конструктору, был добавлен в экземпляр модели, прежде чем он будет сохранен.
  3. Определить классические представления на основе 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 
Смежные вопросы