【问题标题】:how to add current active user as foreign key to the task model in django 3?如何将当前活动用户作为外键添加到 django 3 中的任务模型?
【发布时间】:2020-05-22 07:56:11
【问题描述】:

我正在创建一个使用 django 3 执行网络应用程序的任务, 我有两个模型,一个是 UserCustom,另一个是 UserTask,每个相应的活动用户都可以在其中添加任务。 我正在通过“模型表格”获取条目详细信息。 要添加任务用户需要登录。 但是在 UserTask 模型中提到 UserCustom 作为外键,会在“AddTask.html”页面上创建一个包含所有注册用户的组合(下拉)框。

如何在 UserTask 模型中自动添加当前活动用户作为外键?

下面是代码

models.py

from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
# Create your models here.

class UserCustom(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)

    profile_pic=models.ImageField(upload_to='profile_pics',blank=True)

    def __str__(self):
        return self.user.username   #user os object defined above

class UserTask(models.Model):
    author = models.ForeignKey(UserCustom,on_delete=models.CASCADE)
    label=models.CharField(max_length=264)
    date=models.DateField()
    status=models.BooleanField(default=False)

    def __str__(self):
        return str(self.label)

forms.py

from django import forms
from django.forms.fields import DateField
from django.contrib.auth.models import User
from taskApp.models import UserCustom,UserTask
from django.contrib.admin.widgets import AdminDateWidget

class UserForm(forms.ModelForm):
    password=forms.CharField(widget=forms.PasswordInput())

    class Meta():
        model=User
        fields=('username','email','password')

class UserCustomForm(forms.ModelForm):
    class Meta():
        model=UserCustom
        fields=('profile_pic',)

class UserTaskForm(forms.ModelForm):
    date=DateField(widget=forms.DateInput(attrs={'placeholder': 'YYYY-MM-DD', 'required': 'required'}))
    class Meta():
        model=UserTask
        fields=('author','label','status','date')

views.py

from django.shortcuts import render
from taskApp.forms import UserForm,UserCustomForm,UserTaskForm

#below libraries required for login
from django.contrib.auth import authenticate,login,logout

from django.http import HttpResponseRedirect,HttpResponse
from django.urls import reverse
from django.contrib.auth.decorators import login_required

# Create your views here.
def index(request):
    return render(request,'taskApp/index.html')

@login_required
def add_task(request):
    #return HttpResponse("You are logged in, Nice!")
    added=False
    if request.method == "POST":
        task_form=UserTaskForm(data=request.POST)
        if task_form.is_valid():

            task=task_form.save()
            #task.user=user
            task.save()

            added=True

        else:
            print(task_form.errors)


    else: #no request=POST yet
        task_form=UserTaskForm()

    return render(request,'taskApp/task.html',{'added':added,'task_form':task_form})


@login_required
def user_logout(request):  #only login users can logout
    logout(request)
    return HttpResponseRedirect(reverse('index'))


def register(request):

    registered=False

    if request.method == "POST":

        user_form=UserCustomForm(data=request.POST)
        profile_form=UserProfileInfoForm(data=request.POST)

        if user_form.is_valid() and profile_form.is_valid():

            #grabbing user form ,saving to DB and hashing the password and then saving the changes
            user=user_form.save()
            user.set_password(user.password)
            user.save()

            profile=profile_form.save(commit=False)
            profile.user=user

            if 'profile_pic' in request.FILES:
                profile.profile_pic=request.FILES['profile_pic']

            profile.save()

            registered=True

        else:
            print(user_form.errors,profile_form.errors)

    else: #no request=POST yet
        user_form=UserCustomForm()
        profile_form=UserProfileInfoForm()

    return render(request,'taskApp/registration.html',
                            {'user_form':user_form,
                            'profile_form':profile_form,
                            'registered':registered })



def user_login(request):

    if request.method=='POST':
        username=request.POST.get('username')  #name of element
        password=request.POST.get('password')

        user=authenticate(username=username,password=password)

        if user:
            if user.is_active:
                login(request,user)
                return HttpResponseRedirect(reverse('index')) #redirect to home page
            else:
                return HttpResponse("ACCOUNT NOT ACTIVE")

        else:
            print("Someone tried to login and failed!")
            print("Username: {} and password {}".format(username,password))
            return HttpResponse("invalid login details supllied!")

    else:
        return render(request,'taskApp/login.html',{})

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:

    您可以使用request.user 访问当前用户。

    ...
     if request.method == "POST":
        task_form=UserTaskForm(data=request.POST)
        if task_form.is_valid():
    
            task=task_form.save(commit=False)
            task.author= request.user
            task.save()
    
            added=True
    ...
    

    【讨论】:

    • 它仍然在 /taskApp/addTaskHandle/ 处抛出 ValueError 无法分配“>”:“UserTask.author”必须是“UserCustom”实例。请求方法:POST 我在models.py 中指定外键的方式是否正确?我没有在 settings.py 中添加任何额外的语句,如 AUTH_USER_MODEL ,因为它们是用于旧 django 版本的。@kamilyrb
    • 现在完成了,我必须在models.py中将外键更改为“用户”。谢谢。
    • 现在还好吗?
    • 是的,它的工作原理,我还需要询问如何从上面定义的 UserTask 模型中为特定用户获取任务数据?我正在将views.py中的上下文字典“task_form”发送到“task.html”,我需要从view.py创建和发送任何其他对象吗?
    • 一般情况下,UserTask.objects.filter(author=request.user)可以获取特定用户的任务。您需要在 html 文件或 python 端获取用户的任务吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2012-08-27
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多