将用户与帖子 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.authorrequest.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


注意:通常FormModelForm…Form 后缀结尾, 避免与模型名称冲突,并明确表示我们是 使用表单。因此最好使用SublistForm 而不是 Sublist.


注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用students 更好。更多信息可以查看referencing the User 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:通过网络抓取控制器操作创建帖子时如何将用户与创建的帖子相关联

如何将类别与帖子 wordpress 相关联?

这是将域中的模型与每个帐户的多个用户相关联的正确方法吗?

将现有图像文件与 Django 模型相关联

Python:如何在我的 Django 模板中传递外键的值?

将用户与 Rails 中的嵌套模型相关联