[英]How can I assign the logged in (authenticated) user to the form data they submit?
[英]How can i submit a form with logged in user as default?
注册后,系统会提示您进入登录页面,登录后,您将被重定向到另一个页面,该页面包含用于收集有关新用户的其他信息的表单。 问题是如果我没有在 html 文件中指定 {{form.user}} 实例,则表单不会提交。 可能是因为默认情况下无法识别 user_id。 当我指定它时,该表单让我从现有用户中进行选择,我希望它默认为登录用户 go。
楷模
class AdditionalInfoModel(models.Model):
objects = None
skill_choices = (('Beginner', 'BEGINNER'),
('Intermediate', 'INTERMEDIATE'),
('Expert', 'EXPERT'))
user = models.OneToOneField(User, on_delete=models.CASCADE)
location = models.CharField(max_length=30, blank=True)
assumed_technical_ski_level = models.CharField(max_length=30, choices=skill_choices)
years_of_experience = models.PositiveIntegerField(blank=True)
money_to_spend = models.PositiveIntegerField(blank=True)
def __str__(self):
return self.user.username
观点
class CreateInfoView(LoginRequiredMixin, CreateView):
model = AdditionalInfoModel
form_class = AdditionallnfoModelForm
template_name = "user_ski_experience/additional_info.html"
def get_form_kwargs(self):
variable_to_send = super(CreateInfoView,
self).get_form_kwargs()
variable_to_send.update({'pk': None})
return variable_to_send
def get_success_url(self):
return reverse('aplicatie2:home')
forms
class AdditionallnfoModelForm(forms.ModelForm):
class Meta:
model = AdditionalInfoModel
fields = '__all__'
def __init__(self, pk, *args, **kwargs):
super(AdditionallnfoModelForm, self).__init__(*args,
**kwargs)
self.pk = pk
def clean(self):
return self.cleaned_data
html
{% load crispy_forms_tags %}
{% block content %}
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{% csrf_token %}
<h1> Let's get started with some questions ! </h1>
<h2> This will help us get to know your ski experience
</h2>
<li> Your user name is: {{form.user|as_crispy_field}}</li>
<li> Where do you live ?
{{form.location|as_crispy_field}} </li>
<li> How would you rank yourself as a skier ?
{{form.assumed_technical_ski_level|as_crispy_field}}
</li>
<li> How many years of ski experience do you have ?
{{form.years_of_experience|as_crispy_field}} </li>
<li> How much ar you willing to spend ?
{{form.money_to_spend|as_crispy_field}} </li>
<button type="submit" onclick = "{% url 'aplicatie2:home'
%}">Submit</button>
</form>
</body>
{% endblock %}
登录和注册是使用标准 django 模型完成的
我建议使用禁用字段并通过表单的初始化方法设置用户的初始值。 禁用字段在 POST 请求中被完全忽略,因此用户将无法更改您通过该字段设置的默认用户。
Django 关于禁用属性的文档: https://docs.djangoproject.com/en/4.0/ref/forms/fields/#disabled
视图.py
class CreateInfoView(LoginRequiredMixin, CreateView):
model = AdditionalInfoModel
form_class = AdditionallnfoModelForm
template_name = "user_ski_experience/additional_info.html"
def get_form_kwargs(self):
variable_to_send = super(CreateInfoView,
self).get_form_kwargs()
variable_to_send.update({'pk': None})
variable_to_send.update({'pk_user': self.request.user.pk})
return variable_to_send
def get_success_url(self):
return reverse('aplicatie2:home')
forms.py
class AdditionallnfoModelForm(forms.ModelForm):
class Meta:
model = AdditionalInfoModel
fields = '__all__'
def __init__(self, pk, *args, **kwargs):
pk_user = kwargs.pop('pk_user')
super(AdditionallnfoModelForm, self).__init__(*args,
**kwargs)
self.pk = pk
# Make the user field readonly
self.fields['user'].disabled = True
self.fields['user'].initial = pk_user
def clean(self):
return self.cleaned_data
编辑:还在您的 HTML 中发现了问题。表单不会提交,因为您的 HTML 不适合提交表单。 像下面这样的东西应该有效:
{% load crispy_forms_tags %}
{% block content %}
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- Place the POST endpoint URL in the action attribute of the 'form' tag -->
<form method="post" action="{% url 'aplicatie2:home' %}">
{% csrf_token %}
<h1> Let's get started with some questions ! </h1>
<h2> This will help us get to know your ski experience
</h2>
<li> Your user name is: {{form.user|as_crispy_field}}</li>
<li> Where do you live ?
{{form.location|as_crispy_field}} </li>
<li> How would you rank yourself as a skier ?
{{form.assumed_technical_ski_level|as_crispy_field}}
</li>
<li> How many years of ski experience do you have ?
{{form.years_of_experience|as_crispy_field}} </li>
<li> How much ar you willing to spend ?
{{form.money_to_spend|as_crispy_field}} </li>
<!-- You can't use <button> element for submitting a form without special JS -->
<input type="submit">Submit</button>
</form>
</body>
{% endblock %}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.