0

したがって、この 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 }} を使用している場合、詳細な名前を表示したいのですが、スニペットは詳細な名前を表示する必要があります。しかし、何らかの理由で詳細な名前が表示されません。テンプレートタグを適切に使用していないためだと思いますか?

4

1 に答える 1

1

あなたのフォームでは、きれいなメソッドを持っていると役立つかもしれません:

def clean(self):
    first_name = self.cleaned_data.get('first_name')

    if password is None:
        raise forms.ValidationError('This is a custom error message.')

    return self.cleaned_data

次に、テンプレートに次のようなコードを含めることができます。

    {{ form.first_name }}
    {% if form.first_name.errors %}
        &nbsp;{{form.first_name.errors.as_text}}
    {% endif %}

それ以外の場合、django のデフォルトのフォーム検証は、すべての入力を必須として扱い、その一般的なメッセージを提供します。

ドキュメントからの別のオプションは、フォーム フィールド レベルでエラー メッセージを定義することです: https://docs.djangoproject.com/en/dev/ref/forms/fields/

name = forms.CharField(error_messages={'required': 'Please enter your name'})

これにより、エラーの種類に基づいてカスタム エラー メッセージが追加されるため、この場合、次のようなものを使用できます。

first_name = models.CharField(max_length=50, verbose_name='first Name', validators=[alpha_field], error_messages={'required': 'Please enter a first name'})
于 2013-09-28T17:33:04.097 に答える