Make models owned by users in django

I am using django.contrib.auth and I am wondering how I can make an instance of the model “belong” to a specific user. Do I need to define a foreign key in the model that points to the user? I want users to keep their CRUD.

# 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

Thanks.

+4
source share
2 answers

If you want several objects to belong to an object, the foreign key field for the User object will work . Note that you can still use the foreign key and have one instance, passing the attribute uniqueto define the field.


( ) , . .

user.classroom classroom.user, related_name .

+2

, :

,

  • .
  • 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 . ( 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
+2

Source: https://habr.com/ru/post/1527643/


All Articles