【问题标题】:How to auto detect user in django如何在 django 中自动检测用户
【发布时间】:2019-11-13 11:57:05
【问题描述】:

如何在 Django 中检测用户!我看到大多数人使用外键,但我不想要外键我想检测没有外键的用户我想检测哪个用户填写此表单,例如测试或其他内容

这是我的views.py

def buy_form(request):
    if request.method == 'POST':
        usr_buy = user_buy_form(request.POST)
        if usr_buy.is_valid():
            usr_buys = usr_buy.save(commit=False)
            usr_buys.save()
        else:
            return print(usr_buy.errors)

    else:
        usr_buy = user_buy_form()

    context = {'usr_buy':usr_buy}

    return render(request,'user_buy.html',context)      

这是我的models.py

class user_register_model(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    join_date = models.DateTimeField(default=timezone.now)

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

class user_buy(models.Model):
    users = models.ForeignKey(user_register_model,on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    payment_method = models.CharField(max_length=500)
    price = models.IntegerField()
    Trade_limits = models.IntegerField()
    Location = models.CharField(max_length=1000)

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

这是我的urls.py

urlpatterns = [
    path('', views.Buy_List_View.as_view(),name='index'),
    path('accounts/signup/', views.user_reg,name='register'),
    path('profile/<username>', views.user_profile, name='user_profile'),
    path('sell_btc/',views.buy_form,name='buy_form')
]

这是我的user_buy.html

{% extends 'base.html' %}
{% block body_block %}
<form class="form-control" method="POST">
    {{usr_buy.as_p}}
</form>
{% endblock %}

这是我的forms.py

class user_buy_form(forms.ModelForm):
    class Meta():
        model = user_buy
        fields = '__all__'

【问题讨论】:

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


【解决方案1】:

这可以使用 django 信号处理程序来完成, 您可以通过注册您想要观看的内容以及您想要观看的时间来获取信号。

在你的例子中, 看什么?

  • 用户表(用户模型)

何时观看?

  • 保存之前传入的数据(在您的情况下为用户) 使用“pre_save”处理程序在“用户”模型中定义。

  • 之后 保存数据,使用'post_save'处理程序。

如何观看?

此外,您可以从 django 启用审计日志以查看执行的操作。 https://django-auditlog.readthedocs.io/en/latest/

【讨论】:

    【解决方案2】:

    首先,您应该从表单中排除 users 字段:

    class user_buy_form(forms.ModelForm):
        class Meta():
            model = user_buy
            exclude = ('users',)
    

    然后,在保存您的 user_buy 实例之前,您应该将用户添加到其中:

    def buy_form(request):
        if request.method == 'POST':
            usr_buy = user_buy_form(request.POST)
            if usr_buy.is_valid():
                usr_buys = usr_buy.save(commit=False)
                usr_buys.users = request.user
                usr_buys.save()
            else:
                return print(usr_buy.errors)
    
        else:
            usr_buy = user_buy_form()
    
        context = {'usr_buy':usr_buy}
    
        return render(request,'user_buy.html',context)    
    

    编辑(基于user_register_model模型)

    由于您有一个与 django 用户模型的一对一字段,您应该根据 request.user 查找 user_register_model 实例:

    def buy_form(request):
        if request.method == 'POST':
            usr_buy = user_buy_form(request.POST)
            if usr_buy.is_valid():
                usr_buys = usr_buy.save(commit=False)
                user_register_obj = user_register_model.objects.get(user=request.user)
                usr_buys.users = user_register_obj
                usr_buys.save()
            else:
                return print(usr_buy.errors)
    
        else:
            usr_buy = user_buy_form()
    
        context = {'usr_buy':usr_buy}
    
        return render(request,'user_buy.html',context)    
    

    【讨论】:

    • 我收到此错误NOT NULL constraint failed: bitcoin_user_buy.users_id
    • 那是因为你没有登录。所以request.user 将返回null,你会得到这个错误。如果你想允许匿名用户填写表格,你应该在你的模型中设置blank=Truenull=True。如果没有,请在保存表单之前添加if request.user.is_authenticated
    • 你是使用django的用户模型(django.contrib.auth)还是扩展它?
    • 我正在使用django登录系统
    • 请给我看user_register_model型号代码(外键型号)。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2011-03-21
    • 2021-05-10
    • 2014-07-15
    • 2015-05-14
    相关资源
    最近更新 更多