Ошибка атрибута, у объекта 'WSGIRequest' нет атрибута 'get' Django-HTMX

Я создаю домашнюю страницу, которая включает форму contact-us. Этот элемент контактной формы должен быть многоразовым на нескольких страницах, поэтому я использовал HTMX, чтобы попробовать включить его. Однако я получаю следующую ошибку, которую я не могу понять, потому что я отправляю данные POST.

Request Method: POST
Request URL: http://localhost:8000/contactus

Django Version: 4.2.13
Python Version: 3.9.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'debug_toolbar',
 'accounts',
 'dashboard']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware']


Traceback (most recent call last):
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/core/handlers/base.py", line 220, in _get_response
    response = response.render()
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/forms/utils.py", line 67, in render
    context = context or self.get_context()
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/forms/forms.py", line 322, in get_context
    top_errors = self.non_field_errors().copy()
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/forms/forms.py", line 358, in non_field_errors
    return self.errors.get(
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/forms/forms.py", line 196, in errors
    self.full_clean()
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/forms/forms.py", line 433, in full_clean
    self._clean_fields()
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/forms/forms.py", line 440, in _clean_fields
    value = bf.initial if field.disabled else bf.data
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/forms/boundfield.py", line 135, in data
    return self.form._widget_data_value(self.field.widget, self.html_name)
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/forms/forms.py", line 220, in _widget_data_value
    return widget.value_from_datadict(self.data, self.files, html_name)
  File "/Users/robrobrob/Desktop/Projects/Trolleys/venv/lib/python3.9/site-packages/django/forms/widgets.py", line 297, in value_from_datadict
    return data.get(name)

Exception Type: AttributeError at /contactus
Exception Value: 'WSGIRequest' object has no attribute 'get'

** Forms.py **

Этот файл содержит логику формы

class Contact_Us_Form(forms.Form):
    name = forms.CharField(
        label="Name",
        max_length=60,
        widget=forms.TextInput(attrs={'class': 'form-control'})
    )
    sender = forms.EmailField(
        widget=forms.TextInput(attrs={'class': 'form-control'}), 
        label="Email"
    )
    message_content = forms.CharField(
        widget=forms.Textarea(attrs={'class': 'form-control'}),
        label="Your message"
    )

** Views.py **

для элемента формы

def contact_us_response(request):
    if request.method == "POST":
        form = Contact_Us_Form(data=request.POST)
        if form.is_valid():
            return redirect("partials/success.html")
        else:
            return HttpResponse("Something's broke")
    elif request.method == "GET":
        form = Contact_Us_Form()
        return render(request, "partials/contact.html", {"form": form})
    else:
        form = Contact_Us_Form()
        return HttpResponse("Method not allowed", status=405)

** Views.py **

для главной страницы

def home(request):
    form = Contact_Us_Form()
    return render(request, 'pages/home.html', {'form': form})

** Urls.py **

urlpatterns = [
 path("", include('dashboard.urls')), # the homepage is rendered via separate urls.py on the 'dashboard' app's urls.py
 path('contactus', Contact_Us_Form, name="contact"),
]

** home.html соответствующий раздел с главной страницы **

 <form id="contact-us-form" hx-post="{% url 'contact' %}" hx-target="#contact-us-form">
{{ form }}
<button type="submit" class="btn btn-secondary w-20" >Submit</button>
</form>

** contact.html **

<form>
    <div class="mb-3">
        <label for="name" class="form-label d-inline">Name <p class="text-secondary d-inline">*</p></label>
        {{ form.name }}
    </div>
    <div class="mb-3">
        <label for="email" class="form-label">Email <p class="text-secondary d-inline">*</p></label>
        {{ form.sender }}
    </div>
    <div class="mb-3">
        <label for="message" class="form-label">How can we help you? <p class="text-secondary d-inline">*</p></label>
        {{ form.message_content }}
        <p class="small text-secondary">We'll hold your details in accordance with our Privacy Policy. 
            This site is protected by reCAPTCHA and the <a href="https://policies.google.com/privacy">Google Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms Of Service</a> apply.</p>
    </div>
    <div class="d-flex justify-content-end">
    <button type="submit" class="btn btn-secondary w-20">Submit</button>
    </div>
</form>

Мой процесс поиска и устранения неисправностей Не понимаю, почему POST-данные вызывают ошибку GET. Также не очень понятно, как WSGI попадает в эту картину. Похоже, что подобные ошибки уже возникали на SO без разрешения.

  • Добавлена обработка if/else для сценариев GET в views.py
  • .
  • Добавлены (и удалены) method="POST" и action="contacts" для переопределения этого поведения. Безуспешно
  • Попробовали заменить form = Contact_Us_Form(request.POST) на form = Contact_Us_Form(data = request.POST). Безуспешно
  • .
  • Просмотрел вкладку network на предмет полезной нагрузки и заголовков. Request Method = POST и полезная нагрузка включают ожидаемые поля (name, sender, message content)
  • Добавлены и удалены CSRF ссылки по всему документу. Это не является источником ошибки
  • .

Вы должны указать путь к view так contact_us_response, а не к form (Contact_Us_Form`):

urlpatterns = [
    path(
        '', include('dashboard.urls')
    ),  # the homepage is rendered via separate urls.py on the 'dashboard' app's urls.py
    path('contactus', contact_us_response, name='contact'),
]
Вернуться на верх