将用户与帖子 Django 和 MySQL 相关联
Posted
技术标签:
【中文标题】将用户与帖子 Django 和 MySQL 相关联【英文标题】:associate the user with the post Django and MySQL 【发布时间】:2021-12-23 21:46:14 【问题描述】:我正在尝试将用户与帖子相关联。我有两个模型 students 用于用户,sublists 用于带有 的用户帖子外键(作者)。我正在使用 mysql 数据库并使用表单将数据存储到其中。当我的 form.author 在我的 html 文件中执行时,它会为我提供数据库中所有用户的 id 列表,但我已经登录,我想以登录用户的身份发布而不选择。如果删除它说我的表单无效,这是有道理的,因为我没有输入 form.author。因为我使用的是 MySQL,所以我没有使用内置的用户身份验证方法,而是将电子邮件和密码与登录表单输入。在这方面花费太多时间,但很难解决这个问题。任何帮助将不胜感激
我的 views.py 看起来像这样
def addnew(request):
if request.method == 'POST':
form = Sublist(request.POST)
if form.is_valid():
try:
form.save()
messages.success(request, ' Subscirption Saved')
name = sublist.objects.get(name=name)
return render (request, 'subscrap/main.html', 'sublist': name)
except:
pass
else:
messages.success(request, 'Error')
pass
else:
form = Sublist()
return render(request, 'subscrap/addnew.html', 'form': form)
@login_required(login_url='login')
@cache_control(no_cache=True, must_revalidate=True, no_store=True)
def main(request):
return render(request, 'subscrap/main.html')
def mod(request):
student = students.objects.all()
return render(request, 'subscrap/mod.html' , 'students': student)
我的 Models.py
class students(models.Model):
fname = models.CharField(max_length=50)
lname = models.CharField(max_length=50)
password = models.CharField(max_length = 50 , null = True)
passwordrepeat = models.CharField(max_length = 50, null = True)
email = models.EmailField(max_length=150)
class Meta:
db_table = "students"
class sublist(models.Model):
author = models.ForeignKey(students, related_name='sublist' ,on_delete=models.CASCADE)
name = models.CharField(max_length=150)
cost = models.IntegerField(default = 0)
renewalcycle = models.IntegerField(default = 0)
class Meta:
db_table = "sublist"
因为我使用的是表单,所以这里是我的 forms.py
lass StudentForm(forms.ModelForm):
class Meta:
model = students
fields = "__all__"
class Studentlogin(forms.Form):
email = forms.EmailField(max_length=150)
password = forms.CharField(max_length = 50, widget=forms.PasswordInput)
class Sublist(forms.ModelForm):
class Meta:
model = sublist
fields = "__all__"
【问题讨论】:
学生是用户模型吗? @WillemVanOnsem 是的,学生是用户模型 【参考方案1】:从Sublist
表单中排除Author
:
class Sublist(forms.ModelForm):
class Meta:
model = sublist
exclude = ['author']
在addnew
方法中,您将.instance.author
与request.user
相关联:
@login_required(login_url='login')
def addnew(request):
if request.method == 'POST':
form = Sublist(request.POST)
if form.is_valid():
form.instance.author = request.user
form.save()
messages.success(request, ' Subscirption Saved')
return redirect('some_view')
else:
messages.error(request, 'Error')
else:
form = Sublist()
return render(request, 'subscrap/addnew.html', 'form': form)
注意:Django 中的模型是用 PascalCase 编写的,而不是 snake_case, 所以您可能想将模型从
重命名为sublist
Sublist
。
注意:通常
Form
或ModelForm
以…Form
后缀结尾, 避免与模型名称冲突,并明确表示我们是 使用表单。因此最好使用SublistForm
而不是.Sublist
注意:通常使用
settings.AUTH_USER_MODEL
[Django-doc] 引用用户模型比直接使用students
更好。更多信息可以查看referencing theUser
model section of the documentation。
【讨论】:
谢谢你写得很好的回复,我做了你提到的,但它给了我这个错误“'WSGIRequest'对象没有属性'user'”或者我放的任何东西而不是用户。 @zayan21:那么很可能没有使用AuthenticationMiddleware
作为中间件:这应该将登录用户(在这种情况下为student
)添加到请求对象中。
@zayant21: 并且您的 students
模型可能不是用户模型,因为它缺少一些必要的功能:docs.djangoproject.com/en/3.2/topics/auth/customizing/…
很抱歉,这是我的第一个网络应用项目。 :) 我正在调查我正在尝试搜索更多有关 User-authenticate 方法的信息,以便我可以使用它。泰为你的帮助威廉以上是关于将用户与帖子 Django 和 MySQL 相关联的主要内容,如果未能解决你的问题,请参考以下文章
Rails 6:通过网络抓取控制器操作创建帖子时如何将用户与创建的帖子相关联