如何连接登录模型和发布模型

时间:2018-12-23 07:52:15

标签: django

我创建了一个登录和注册模型,还创建了一个发布模型,用户可以在其中发布标题和描述。但是,当我使用用户登录并创建帖子时,其他用户也会查看该帖子。

我正在将Django(python)与数据库sql一起使用。

用于注册表格:

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm


class UserCreateForm(UserCreationForm):
class Meta:
    fields = ("username", "email", "password1", "password2")
    model = get_user_model()

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields["username"].label = "Display name"
    self.fields["email"].label = "Email address"

url.py:

from django.conf.urls import url
from django.contrib.auth import views as auth_views
from . import views

app_name = 'accounts'

urlpatterns = [
url(r"login/$",auth_views.LoginView.as_view(template_name="accounts/login.html"),name='login'),
url(r"logout/$", auth_views.LogoutView.as_view(), name="logout"),
url(r"signup/$", views.SignUp.as_view(), name="signup"),
]

如何将我的帖子限制为该特定用户?

2 个答案:

答案 0 :(得分:1)

嗯,很简单。您需要像这样定义帖子模型和用户模型之间的关系:

$ file WebRTC.framework/WebRTC
WebRTC.framework/WebRTC: Mach-O universal binary with 4 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64]
WebRTC.framework/WebRTC (for architecture x86_64):  Mach-O 64-bit dynamically linked shared library x86_64
WebRTC.framework/WebRTC (for architecture i386):    Mach-O dynamically linked shared library i386
WebRTC.framework/WebRTC (for architecture armv7):   Mach-O dynamically linked shared library arm_v7
WebRTC.framework/WebRTC (for architecture arm64):   Mach-O 64-bit dynamically linked shared library arm64

现在在“创建后视图”中,您可以这样操作:

from django.contrib.auth import get_user_model

User = get_user_model()

class Post(models.Model):
    created_by = models.ForeignKey(User)
    # rest of the fields

最后在ListView中,您需要定义如下查询集:

from django.contrib.auth.mixins import LoginRequiredMixin

class PostCreateView(LoginRequiredMixin, CreateView):
    # ...
    def form_valid(self, form):
        form.created_by = self.request.user
        return super(PostCreateView, self).form_valid(form)

答案 1 :(得分:0)

您的问题是一个称为授权的概念。您需要检查用户对帖子的访问权限,因此每个用户只能看到他的帖子。

  • 首先在每个实例上使用userpost模型旁边保存ForeignKey。这样每个帖子都会分配一个user

  • 现在与每个用户一起访问帖子视图时,检查该用户是否已通过身份验证,如果通过,则检查该用户是否是该帖子的所有者,如果不是,则给他403拒绝权限错误。 / p>

例如,如果您的Post模型是这样的:

class Post(models.Model):
    user = models.ForeignKey(User)
    content = models.CharFie.........
    .....

然后在每个访问帖子的请求上,检查是否允许用户查看该帖子:

post = Post.objects.get(id=1)    # For example you want to check post with id of 1
if post.user.id == request.user.id:
    # Then allow user to see it,
else:
    # Raise error 403

注意:还要在帖子查看前添加login_required装饰器。或IsAuthenticated权限级别(如果您使用的是 CBV )。