したがって、この getattribute 関数を使用したい (このリンクにあります) https://snipt.net/Fotinakis/django-template-tag-for-dynamic-attribute-lookups/
私のdjangoテンプレートで。models.py がある app フォルダーに templatetags フォルダーを作成しました。また、空のinint .py ファイルを作成して templatetags フォルダーに保存しました。次に、テンプレート タグ フォルダーに getattribute.py というファイルを作成し、上記のリンクにあるスニペットをコピーして getattribute.py ファイルに貼り付け、ファイルを保存しました。
これは私のテンプレートがどのように見えるかです:
<html>
<body>
<form method="post" action="">{% csrf_token %}
{{ form.first_name }} {{form.last_name }} <br>
{{ form.username }} {{ form.password }} <br>
<input type="submit" value="Register"/>
</form>
{% load getattribute %}
{% for field, error in form.errors.items %}
{% if forloop.counter == 1 %}
{% with field_obj=form|getattribute:field %}
{{ field_obj.label }}{{ error | striptags }}
{% endwith %}
{% endif %}
{% endfor %}
</body>
</html>
これが私のmodels.pyの外観です。
class Users(models.Model):
alpha_field = RegexValidator(regex=r'^[a-zA-Z]+$', message='Name can only contain letters')
user_id = models.AutoField(unique=True, primary_key=True)
username = models.SlugField(max_length=50, unique=True)
first_name = models.CharField(max_length=50, verbose_name='first Name', validators=[alpha_field])
last_name = models.CharField(max_length=50, validators=[alpha_field])
password = models.SlugField(max_length=50)
私のforms.pyはこれです。
class UsersForm(forms.ModelForm):
class Meta:
model = Users
widgets = {'password':forms.PasswordInput()}
def __init__(self, *args, **kwargs):
super( UsersForm, self ).__init__(*args, **kwargs)
self.fields[ 'username' ].widget.attrs[ 'placeholder' ]="Username"
self.fields[ 'first_name' ].widget.attrs[ 'placeholder' ]="First Name"
self.fields[ 'last_name' ].widget.attrs[ 'placeholder' ]="Last Name"
self.fields[ 'password' ].widget.attrs[ 'placeholder' ]="Password"
self.fields['first_name'].label='first Name'
これは私のviews.pyです
def home_page(request):
form = UsersForm()
if request.method == "POST":
form = UsersForm(request.POST)
if form.is_valid():
form.save()
c = {}
c.update(csrf(request))
c.update({'form':form})
return render_to_response('home_page.html', c)
これで、サーバーを実行すると、フォームがエラーなしで表示されます。ただし、わざと名のセクションに入力せずに送信を押すと、「このフィールドは必須です」と表示されます。テンプレートで {{ field_obj.label }} を使用している場合、詳細な名前を表示したいのですが、スニペットは詳細な名前を表示する必要があります。しかし、何らかの理由で詳細な名前が表示されません。テンプレートタグを適切に使用していないためだと思いますか?