представление django 'GET' не работает, 'POST' работает - PullRequest
0 голосов
/ 30 октября 2018

Понятия не имею почему, но если я попытаюсь «ПОЛУЧИТЬ» это представление, я получу эту ошибку:

django.urls.exceptions.NoReverseMatch: Reverse for 'profile-update-name' with arguments '('',)' not found. 1 pattern(s) tried: ['ce_profiles/profile\\-update\\-name/(?P<pk>[0-9]+)/$']

Но если отправить запрос POST, все в порядке. ???

Вот рабочий процесс:

Сначала я получаю доступ к этому представлению и шаблону:

def customer_profile(request, pk):
    name = get_object_or_404(CEName, id=pk)
    return render(
        request,
        'customer/customer_profile.html',
        {'profile_name': name}
    )

{% block content %}
  {% include 'ce_profiles/name_header.html' %}
  <div id="name" class="container d-flex justify-content-between pt-1">
    {% include 'ce_profiles/profile_name.html' %} <!-- displays the profile_name -->
    <button id="update_button" action="{% url 'ce_profiles:profile-update-name' profile_name.id %}" class="bold btn btn-main btn-sm button-main">UPDATE</button>
  </div>
  <div id="div_NameForm" class="container">
  </div>
{% endblock %}

{% block script %}
  <script src="{% static 'ce_profiles/ce_profiles.js' %}"></script>

{% endblock %}

Когда я нажимаю кнопку обновления, он должен AJAX в форме, которая будет изменена. Я попытался заменить переменную на «1», но она все еще не работает. У меня есть тесты, чтобы убедиться, что само представление не работает с «GET», но работает с «POST», кроме предыдущего представления.

urls.py

app_name='ce_profiles'
urlpatterns = [
    path('profile-update-name/<int:pk>/', views.profile_update_name,
        name='profile-update-name'
    ),
]

вид

def profile_update_name(request, pk):
    name = get_object_or_404(CEName, id=pk)
    if request.POST:
        name_form = NameForm(data=request.POST, instance=name)
        if name_form.has_changed() == False:
            name_form.add_error(None, _('No changes made.'))
        if name_form.is_valid():
            name_form.save()
            updated_name = get_object_or_404(CEName, id=name.id)
            profile_name_json = render_to_string(
                'ce_profiles/profile_name.html',
                {'profile_name': updated_name,}
            )
            return JsonResponse({'profile_name': profile_name_json})
        else:
          return JsonResponse({'error': name_form.errors})
    else:
        name_form = NameForm(instance=name)
        get_NameForm_json = render_to_string(
            'ce_profiles/update_NameForm.html',
            {'NameForm': name_form}
        )
        return JsonResponse({'NameForm': get_NameForm_json})

Вот шаблон. Чего-то не хватает?

update_NameForm.html

<div id="div_NameForm" class="container">
  <hr size="3px">
  <form id="NameForm" method="POST" action="{% url 'ce_profiles:profile-update-name' profile_name.id %}">
    {% csrf_token %}
    {{ NameForm.as_p }}
    <div id="NameForm_errors"></div>
    <br>
    <button id="save_changes" type="submit" class="btn btn-main button-main btn-block">Save Changes</button>
  </form>
</div>

1 Ответ

0 голосов
/ 30 октября 2018

Вместо использования render_to_string вы можете использовать render(), и вы забыли отправить переменную profile_name: в шаблоны.

def profile_update_name(request, pk):
    name = get_object_or_404(CEName, id=pk)
    if request.POST:
       ''' code '''

    # no need to use else statement
    # since 'return' breaks the 'if request.POST' statement
    name_form = NameForm(instance=name)
    context = {
        profile_name:name,
        'NameForm': name_form,
    }
    return render(request,'ce_profiles/update_NameForm.html',context) 

Обратите внимание, что вы можете оставить action='' пустым в форме, что будет означать то же представление

 <form id="NameForm" method="POST" action="">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...