Рендеринг html-формы в django с помощью forms.py

У меня есть веб-приложение django с системой аутентификации в нем. У меня есть представление регистрации пользователя, модель клиента и

UserCreationForm in forms.py:

class CustomerSignUpForm(UserCreationForm):
    first_name = forms.CharField(required=True)
    last_name = forms.CharField(required=True)
    # phone_number = forms.CharField(required=True)
    # location = forms.CharField(required=True)

    class Meta(UserCreationForm.Meta):
        model = User
    
    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_customer = True
        user.first_name = self.cleaned_data.get('first_name')
        user.last_name = self.cleaned_data.get('last_name')
        print(user.last_name)
        user.save()
        customer = Customer.objects.create(user=user)
        # customer.phone_number=self.cleaned_data.get('phone_number')
        # customer.location=self.cleaned_data.get('location')
        customer.save()
        return user

Моя модель выглядит следующим образом:

...
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    phone_number = models.CharField(max_length=20)
    location = models.CharField(max_length=20)

Я придаю форму в своем customer_register.html:

...
<section>
        <div class="container">
          <div class="row">
            <div class="col-md-6 mx-auto">
              <div class="card">
                <div class="card-header text-black">
                  <h2>Register</h2>
                </div>
                <div class="card-body">
                    <form action="{% url 'customer_register' %}" method="POST" novalidate>
                      {% csrf_token %}
                        {% for field in form.visible_fields %}
                           <div class="form-group">
                               {{ field.label_tag }}
                                  {% render_field field class="form-control" %}
                                    {% for error in field.errors %}
                                      <span style="color:red">{{ error }}</span>
                                    {% endfor %}
                         {% endfor %}
                          </div>
                    </form>
                 </div>
                    </div>   
                </div>
              </div>
            </div>
        </div>
      </section>
...

Хотя выглядит не очень красиво.

Я хочу заменить мою форму в customer_register.html на новую форму, в которой я не буду использовать widget_tweaks, а только html.

Я не совсем понимаю, что вы имеете в виду под "не будет использовать widget_tweaks, а только html"


но если форма некрасивая, вы всегда можете сами отрисовать/разместить поля формы, сделав что-то вроде:

<form action="{% url 'customer_register' %}" method="POST" novalidate>
  <div class="row justify-content-md-center">
    <div class="col-md-3 col-md-auto text-center">
      <b>First Name:<b>
      {{ form.first_name }}
      {% if 'first_name' in error %}
        <div style='color:red'>{{error.first_name.0.message}}</div>
      {% endif %}
    </div>
    <div class="col-md-3 col-md-auto text-center">
      <b>Last Name:<b>
      {{ form.last_name }}
      {% if 'last_name' in error %}
        <div style='color:red'>{{error.last_name.0.message}}</div>
      {% endif %}
    </div>
  </div>
</form>

Вы также можете добавить классы в функции Forms.py __init__, а затем добавить немного CSS, чтобы это выглядело красиво (я предполагаю, что это Widget Tweaking , но я не вижу этого в вашей оригинальной форме

).
class CustomerSignUpForm(UserCreationForm):
    first_name = forms.CharField(required=True)
    last_name = forms.CharField(required=True)
    # phone_number = forms.CharField(required=True)
    # location = forms.CharField(required=True)

    def __init__(self,  *args, **kwargs):
        super(CustomerSignUpForm, self).__init__(*args, **kwargs)
        self.fields['first_name'].widget.attrs={'class': 'form-control'}
        self.fields['last_name'].widget.attrs={'class': 'form-control'}

Или вы можете просто создать HTML-поля самостоятельно... Все, что интересует форму и бэкенд, это атрибут 'name' - но! Вы теряете всю динамическую валидацию, которую делает Django. Поэтому я рекомендую сделать первый вариант

<form action="{% url 'customer_register' %}" method="POST" novalidate>
  <div class="row justify-content-md-center">
    <div class="col-md-3 col-md-auto text-center">
      <b>First Name:<b>
      <input type="text" name="first_name" max_length="100" required class="form-control"></input>
      {% if 'first_name' in error %}
        <div style='color:red'>{{error.first_name.0.message}}</div>
      {% endif %}
    </div>
    <div class="col-md-3 col-md-auto text-center">
      <b>Last Name:<b>
      <input type="text" name="last_name" max_length="100" required class="form-control"></input>
      {% if 'last_name' in error %}
        <div style='color:red'>{{error.last_name.0.message}}</div>
      {% endif %}
    </div>
  </div>
</form>
Вернуться на верх