python - 如何在模型或视图中请求用户登录
问题描述
我是 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']
解决方案
请不要为此使用 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)
注意:您可以使用
LoginRequiredMixin
mixin [Django-doc]将视图限制为对经过身份验证的用户的基于类的视图 。
推荐阅读
- azure - 使用来自服务主体的 oAuth 令牌进行身份验证,会产生“受众无效”错误
- python - 在代码中还是在数据库中生成标识符更好?
- swift - 在一个列表中。变异运算符的左侧不可变:'item' 是 'let' 常量
- kubernetes - 为什么我会得到预期:在 kpt pkg get 期间 MappingNode 是 SequenceNode?
- r - 如何从函数打印一个结果但存储其他结果
- javascript - 如何在新窗口中打开除特定href之外的所有非现场链接?
- express - 如何在express js中向客户端发送数据?
- ruby-on-rails - 如何从 Rails 模型中添加常量值
- python - 将 n 次多项式的系数应用于公式
- python - 正确实现 For 循环