Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在模型或视图中请求用户登录_Python_Django_Request - Fatal编程技术网

Python 如何在模型或视图中请求用户登录

Python 如何在模型或视图中请求用户登录,python,django,request,Python,Django,Request,我是Django的新手,我不知道如何通过请求获取用户名。我在词汇类型的网站上工作,我需要每个用户创建的条目都有用户名 这是我的模特 from django.db import models class EngDict(models.Model): orig_word = models.CharField(max_length=500, null=False,blank=False, verbose_name='Слово') translate = models.CharFi

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

这是我的模特

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),但我不明白应该在哪里写它,以及里面必须包含什么。我需要发布的变量是自动填写用户登录名

在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']
请不要为此使用
CharField
。如果以后用户更改了用户名,则它指的是不再存在的用户。要引用另一个对象,可以使用关系字段,如、或、。在这里,它看起来像一个
外键
是您正在寻找的:

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']
注意:您可以将基于类的视图限制为具有

请不要为此使用
CharField
。如果以后用户更改了用户名,则它指的是不再存在的用户。要引用另一个对象,可以使用关系字段,如、或、。在这里,它看起来像一个
外键
是您正在寻找的:

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']
注意:您可以将基于类的视图限制为具有


这回答了你的问题吗?这回答了你的问题吗?我更新了问题。在forms.py中添加了exclude。现在我遇到了错误“没有这样的列:dict_engdict.published_by_id”我尝试迁移,但出现了错误:django.db.utils.integrityyror:表'dict_engdict'中主键为'2'的行有一个无效的外键:dict_engdict.published_by_id包含一个值'Alexander',在auth_user.id中没有相应的值。Ok。我已经删除了所有的条目。成功完成了迁移,现在可以正常工作了!添加简单的用户名会带来很多麻烦。非常感谢。我更新了问题。在forms.py中添加了exclude。现在我遇到了错误“没有这样的列:dict_engdict.published_by_id”我尝试迁移,但出现了错误:django.db.utils.integrityyror:表'dict_engdict'中主键为'2'的行有一个无效的外键:dict_engdict.published_by_id包含一个值'Alexander',在auth_user.id中没有相应的值。Ok。我已经删除了所有的条目。成功完成了迁移,现在可以正常工作了!添加简单的用户名会带来很多麻烦。非常感谢。