python 如何通过表单自动获取Django admin中的用户

9gm1akwq  于 2022-11-21  发布在  Python
关注(0)|答案(2)|浏览(190)

我在我的django网站上有一个表单,用户在那里请求硬币,信息被发送到管理员让我处理。我想自动获得填写表单的用户,而不需要他们自己做。
下面是model.py文件:

class Requestpayment (models.Model):
  username= models.ForeignKey(User, on_delete= models.CASCADE, null=True)
  useremail= models.CharField(max_length=100)
  accountmail= models.CharField(max_length=100)
  accountphonenumber=models.CharField(max_length=15)
  coinsrequested=models.ForeignKey(Requestamount, on_delete= models.SET_NULL, null=True)
  created= models.DateTimeField(auto_now_add=True)

  def __str__(self):
    return self.accountmail

forms.py:

class Requestpaymentform (ModelForm):
    class Meta:
        model = Requestpayment
        fields = '__all__'

以及views.py:

@login_required(login_url='login')   
def redeemcoins (request):
    form = Requestpaymentform
    if request.method =='POST':
        form = Requestpaymentform(request.POST)
        if form.is_valid():
             form = form.save(commit=False)
             username = request.user
             form.save()
             return redirect ('home')

我很确定有什么地方不对劲,但我不知道是什么(我在django很新),反正表单总是显示网站中的所有用户,让当前用户选择他们是谁。
redeem coins page
我也尝试排除该部分的形式,但它没有工作,它只是显示在管理空白。
谢谢你,谢谢你。

yzuktlbb

yzuktlbb1#

您需要将它指派给 Package 在表单中的执行严修,因此:

@login_required(login_url='login')
def redeemcoins(request):
    form = Requestpaymentform()
    if request.method == 'POST':
        form = Requestpaymentform(request.POST)
        if form.is_valid():
            form.instance.username = request.user
            form.save()
            return redirect('home')
    # …

但是,将此字段命名为user比命名为username更有意义。在模型中,您还可以将username字段设置为不可编辑,这样它就不会出现在表单中:

from django.conf import settings

class Requestpayment(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, editable=False, on_delete=models.CASCADE
    )
    # …

注意:通常使用**settings.AUTH_USER_MODEL[Django-doc]来引用用户模型比直接使用User**模型[Django-doc]要好。更多信息,请参见文档的 referencing the User model 部分。

gjmwrych

gjmwrych2#

当你使用username= models.ForeignKey(User, on_delete= models.CASCADE, null=True)时,Django会在你的数据库中添加一个名为user_id的字段,它允许Django找到用户对象来请求付款。
您可以使用user_id字段在Requestpayment中添加用户对象。
1.如果您想在视图中显示用户,则不需要在字段列表中传递用户名字段。

class Requestpaymentform (ModelForm):
    class Meta:
    model = Requestpayment

    #fields = '__all__'
    fields = ['useremail',
              'accountmail',
              'accountphonenumber',
              'coinsrequested',
              'created']

1.现在,执行此操作以使用户进入视图。

@login_required(login_url='login')
def redeemcoins(request):
    form = Requestpaymentform()
    if request.method == 'POST':
        form = Requestpaymentform(request.POST)
        if form.is_valid():
            requestpayment = form.save(commit=False)
            requestpayment.user_id = request.user.id 
            requestpayment.save()
            return redirect('home')

最好使用user而不是username,因为它是User对象,而不是简单的字段。
请为我的英语!!!

相关问题