Как автоматически получить пользователя в админке django через форму

У меня есть форма на моем сайте 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

the 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) в любом случае, форма всегда показывает всех пользователей на сайте, чтобы текущий пользователь мог выбрать, кто он.

страница с редим монетами

Я также пробовал исключить эту часть формы, но это не помогло, она просто отображается пустой в админке.

Спасибо.

Вам нужно присвоить его экземпляру, обернутому в форму, так:

@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
    )
    # …

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

Когда вы используете username= models.ForeignKey(User, on_delete= models.CASCADE, null=True), Django добавляет поле user_id в вашу базу данных, что позволяет django найти объект User для Requestpayment.

Вы можете использовать поле user_id для добавления объекта User в Requestpayment.

  1. Вам не нужно передавать поле username в списке полей, если вы хотите получить пользователя в представлении.

    class Requestpaymentform (ModelForm):
        class Meta:
        model = Requestpayment
    
        #fields = '__all__'
        fields = ['useremail',
                  'accountmail',
                  'accountphonenumber',
                  'coinsrequested',
                  'created']
    
  2. Теперь сделайте следующее, чтобы получить пользователя в представлении.

    @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, а не простое поле.

Прошу прощения за мой английский!!!

Вернуться на верх