Как автоматически получить пользователя в админке 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 theUser
model [Django-doc] directly. For more information you can see the referencing theUser
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.
Вам не нужно передавать поле username в списке полей, если вы хотите получить пользователя в представлении.
class Requestpaymentform (ModelForm): class Meta: model = Requestpayment #fields = '__all__' fields = ['useremail', 'accountmail', 'accountphonenumber', 'coinsrequested', 'created']
Теперь сделайте следующее, чтобы получить пользователя в представлении.
@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, а не простое поле.
Прошу прощения за мой английский!!!