gpt4 book ai didi

python - 如何在 Django 中添加访客(匿名)用户的新记录

转载 作者:行者123 更新时间:2023-12-04 15:24:33 25 4
gpt4 key购买 nike

我是 Django 的初学者,我非常需要你的帮助。

部分代码:

模型.py

from django.contrib.auth.models import User

class Author(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
department = models.CharField(max_length=200)

def __str__(self):
return self.user.username

class hardware(models.Model):
hostname = socket.gethostname()
login_username = getpass.getuser()
user = User.username

hardware_name = models.CharField(max_length=20)
order_no = models.CharField(max_length=10)
price = models.DecimalField(max_digits=5,decimal_places=2)
confirm = models.BooleanField(default=False)
login_user = models.ForeignKey(Author, on_delete=models.CASCADE)
computer_login_user = models.CharField(max_length=10,default=login_username)
computer = models.CharField(max_length=30,default=hostname)


def __str__(self):
return self.order_no

View .py

def get_author(user):
qs = Author.objects.filter(user=user)
if qs.exists():
return qs[0]
return None

def new_record(request):
form = OrderForm(request.POST or None, request.FILES or None)
if form.is_valid():
author = get_author(request.user)
form.instance.login_user = author
form.save()
return redirect(all_records)

context = {
'form': form
}
return render(request, 'orders/form.html', context)

我会尽量简要地解释我的问题。

计算机在公共(public)场所(制作),任何人都可以添加新记录。这就是为什么表中包含有关主机名、计算机登录用户和登录用户的信息。

所以当用户登录系统时它工作得很好,但是当一个新的记录试图添加一个未登录的用户( guest )时就会出现问题。是错误“'AnonymousUser' 对象不可迭代”。我知道 request.user 现在是空的。

好的,现在问题...

如何添加“访客”用户并在没有人登录的情况下添加??如何在用户未登录的情况下添加新记录??

很抱歉发了这么长的帖子,感谢所有建议。

最佳答案

所以,如果我理解正确的话,你可以通过以下几种方式做到这一点:

  1. 最简单的方法是简单地将 login_user 字段设置为 nullable 和空白,或者,
  2. 在不活动的 Django 数据库中创建一个“ guest 用户”和“ guest 作者”(is_active 设置为 False,因此他们无法登录)并且所有匿名用户都被分配给该用户和作者实例数据库。

如前所述,最简单的方法就是将 login_user 字段设置为可为空且为空,如下所示:

login_user = models.ForeignKey(Author, on_delete=models.CASCADE, blank=True, null=True)

如果您的 get_author() 返回 None,则将该列留空,但如果需要 Author 或 User 对象,这可能会影响应用程序的其他部分别处。

使用“访客”用户在 get_author() 方法中执行此操作的另一种方法:

def get_author(user):
if user.is_anonymous:
guest_user = User.objects.get(username="guest") # or whatever ID or name you use for the placeholder user that no one will be assigned
guest_author = Author.objects.get_or_create(user=guest_user)
return guest_author
else:
return Author.objects.get(user=user)

在此选项中,您需要将作者中的部门字段设置为空白和 null 或设置默认值,如:

class Author(models.Model):
user = ...
department = ...(..., default="none")

 class Author(models.Model):
user = ...
department = ...(..., blank=True, null=True)

另一种选择可能是为每个操作创建一个新的“访客”用户:

import random
import string

def randomString(stringLength):
letters = string.ascii_letters
return ''.join(random.choice(letters) for i in range(stringLength))

def get_author(user):
if user.is_anonymous:
random_username = f"{randomString(10)}_guest"
random_email = f"{randomString(5)}_guest@example.com"
guest_user = User.objects.create(username=random_username, is_active=False, email=random_email...)
guest_author = Author.objects.create(user=guest_user, department="none")
return guest_author
else:
return Author.objects.get(user=user)

关于python - 如何在 Django 中添加访客(匿名)用户的新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62544490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com