首页 > 解决方案 > 如何在模型或视图中请求用户登录

问题描述

我是 Django 的新手,我不知道如何通过请求获取用户名。我正在研究词汇类型的网站,我需要用户创建的每个条目都有用户名。

这是我的models.py

from django.db import models

class EngDict(models.Model):

    orig_word = models.CharField(max_length=500, null=False,blank=False, verbose_name='Слово')
    translate = models.CharField(max_length=500,null=False,blank=False, verbose_name="Перевод")
    remarks = models.TextField(null=True, blank=True, verbose_name="Примечания")
    published_by = models.CharField(max_length=50, verbose_name="Добавлено")
    published_date = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name="Дата добавления")
    category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.PROTECT, verbose_name = 'Категория')

    class Meta:
        verbose_name = ("Перевод")
        verbose_name_plural = "Англо-русский словарь"
        ordering = ['-published_date']

这是views.py

from django.shortcuts import render
from django.template import loader
from .models import EngDict, Category
from django.views.generic.edit import CreateView
from .forms import EngDictForm
from django.urls import reverse_lazy
from django.views.generic import TemplateView, ListView, FormView
from django.db.models import Q
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login

class EngDictCreateView(CreateView):
    template_name = 'dict/create.html'
    form_class = EngDictForm
    success_url = reverse_lazy('index')


    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['categories'] = Category.objects.all()
        return context

我看到我需要一些像 def user_name(request) 这样的函数,但我不明白我应该在哪里写它以及其中必须包含什么。我需要用用户登录名自动填写published_by变量

在 forms.py 中添加了排除

from django.forms import ModelForm
from .models import EngDict
from django import forms


class EngDictForm (ModelForm):
    def clean_orig_word(self):
        data = self.cleaned_data['orig_word']
        if EngDict.objects.filter(orig_word = data).count():
            raise forms.ValidationError("ТАКОЕ СЛОВО УЖЕ ЕСТЬ!")
        return data
    class Meta:
        model = EngDict
        fields = ('orig_word', 'translate', 'remarks', 'published_by')
        exclude =['published_by']

标签: pythondjangorequest

解决方案


请不要为此使用 a CharField。如果稍后用户更改了他们的用户名,那么它指的是不再存在的用户。要引用另一个对象,可以使用ForeignKey[Django-doc]OneToOneField[Django-doc]ManyToManyField[Django-doc]之类的关系字段。这里看起来 aForeignKey是您正在寻找的:

from django.conf import settings

class EngDict(models.Model):
    orig_word = models.CharField(max_length=500, null=False,blank=False, verbose_name='Слово')
    translate = models.CharField(max_length=500,null=False,blank=False, verbose_name='Перевод')
    remarks = models.TextField(null=True, blank=True, verbose_name='Примечания')
    published_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        editable=False,
        verbose_name='Добавлено'
    )
    published_date = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Дата добавления')
    category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.PROTECT, verbose_name = 'Категория')

    class Meta:
        verbose_name = ('Перевод')
        verbose_name_plural = 'Англо-русский словарь'
        ordering = ['-published_date']

在您应该排除的形式中,然后published_by在 中CreateView,您可以使用以下命令“修补”对象:

from django.contrib.auth.mixins import LoginRequiredMixin

class EngDictCreateView(LoginRequiredMixin, CreateView):
    template_name = 'dict/create.html'
    form_class = EngDictForm
    success_url = reverse_lazy('index')


    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['categories'] = Category.objects.all()
        return context

    def form_valid(self, form):
        form.instance.published_by = self.request.user
        return super().form_valid(form)

注意:您可以使用LoginRequiredMixinmixin [Django-doc]将视图限制为对经过身份验证的用户的基于类的视图 。


推荐阅读