Не удалось удалить/отредактировать запись с пк

#python-3.x #django

Вопрос:

У меня есть список свойств в представлении и шаблоне. В шаблоне у меня есть кнопка редактирования и кнопка удаления. Ни один из них не работает, но один и тот же код из разных проектов работает просто отлично. Они не выдают никаких ошибок отладки ни в проводнике, ни на уровне журнала. Он принимает щелчок/ввод, переходит по нужному URL-адресу, но остается на странице «rei_properties».

Я использую фреймворк Django 3.1.6…

просмотр, чтобы просмотреть все записи в модели «Свойство» :

 def rei_properties(request):
    props = Property.objects.all()
    return render(request, 'rei/rei_properties.html', {'props': props})
 

шаблон с/ редактированием/удалением ссылок:

 <table>
 <tr>
  <th>Address</th>
  <th>City</th>
  <th>State</th>
  <th>Zipcode</th>
  <th colspan=2>Actions</th>
 </tr>
{% for prop in props %}
 <tr>
  <td>{{ prop.address }}</a></td>
  <td>{{ prop.city }}</a></td>
  <td>{{ prop.state }}</a></td>
  <td>{{ prop.zipcode }}</a></td>
  <td>
        <a href="{% url 'rei_properties' %}edit/{{ prop.pk }}/">Edit</a>
 </td>
 <td>
        <a href="{% url 'rei_properties' %}del/{{ prop.pk }}/" onclick="return confirm('Are you sure you want to delete this?')">Delete</a>
 </td>
 </tr>
{% endfor %}
</table>
 

Мои URL-адреса:

     url(r'^rei_properties/', views.rei_properties, name='rei_properties'),
    url(r'^rei_properties/edit/(?P<pk>[0-9]{1,10})/

и, наконец, мои представления удаления и редактирования:

 def rei_properties_edit(request, pk):
    prop = get_object_or_404(Property, pk=pk)
    if request.method == 'POST':
        form = PropertyForm(request.POST, instance=prop)
        if form.is_valid():
            prop = form.save(commit=False)
            prop.save()
            return redirect('rei_properties')
    else:
        form = PropertyForm(instance=prop)
    return render(request, 'rei/rei_properties_edit.html', {'form': form})

def rei_properties_del(request, pk):
    Property.objects.get(pk=pk).delete()
    return redirect('rei_properties')
 

Ответ №1:

менять ,

 <td>
        <a href="{% url 'rei_properties' %}edit/{{ prop.pk }}/">Edit</a>
 </td>

 <td>
        <a href="{% url 'rei_properties' %}del/{{ prop.pk }}/" onclick="return confirm('Are you sure you want to delete this?')">Delete</a>
 </td>
 

Для

 <td>
        <a href="{% url 'rei_properties_edit' prop.pk %}">Edit</a>
 </td>
 <td>
        <a href="{% url 'rei_properties_del' prop.pk  %}" onclick="return confirm('Are you sure you want to delete this?')">Delete</a>
 </td>
 

Атрибут имени URL-адреса используется для прямой связи вызова из шаблона, а не для создания формата URL-адреса...

ДОБАВЛЕНО, я бы посоветовал вам назвать свое приложение в urls.py как ,

urls.py

 from django.urls import path,include
from . import views

app_name = 'your_app_name'
urlpatterns = [
    path('', views.home , name = "your_url_name"),
]
 

и из шаблонов вы можете ссылаться на конкретный URL-адрес конкретного приложения, потому что в разных приложениях может быть одно и то же имя URL-адреса... Нравится ,

 <td>
        <a href="{% url 'rei_properties' %}edit/{{ prop.pk }}/">Edit</a>
 </td>

 <td>
        <a href="{% url 'your_app_name:your_url_name' %}del/{{ prop.pk }}/" onclick="return confirm('Are you sure you want to delete this?')">Delete</a>
 </td>
 

Комментарии:

1. Еще одна проблема заключается в том , что у OP есть шаблон ^rei_properties/ , который также будет соответствовать шаблону ^rei_properties/edit/(?P<pk>[0-9]{1,10})/$ и удалению, потому что он не заканчивается на a $ , поэтому первое представление будет использоваться для всех 3 URL-адресов.

2. Удаление объекта должно выполняться с помощью запроса POST или запроса на УДАЛЕНИЕ, а не запроса GEt.

3. Это было потому, что я не добавил $ в конце ^rei_properties/ URL-адреса.

, views.rei_properties_edit, name='rei_properties_edit'),
url(r'^rei_properties/del/(?P<pk>[0-9]{1,10})/и, наконец, мои представления удаления и редактирования:


Ответ №1:

менять ,


Для


Атрибут имени URL-адреса используется для прямой связи вызова из шаблона, а не для создания формата URL-адреса...

ДОБАВЛЕНО, я бы посоветовал вам назвать свое приложение в urls.py как ,

urls.py


и из шаблонов вы можете ссылаться на конкретный URL-адрес конкретного приложения, потому что в разных приложениях может быть одно и то же имя URL-адреса... Нравится ,


Комментарии:

1. Еще одна проблема заключается в том , что у OP есть шаблон ^rei_properties/ , который также будет соответствовать шаблону ^rei_properties/edit/(?P<pk>[0-9]{1,10})/$ и удалению, потому что он не заканчивается на a $ , поэтому первое представление будет использоваться для всех 3 URL-адресов.

2. Удаление объекта должно выполняться с помощью запроса POST или запроса на УДАЛЕНИЕ, а не запроса GEt.

3. Это было потому, что я не добавил $ в конце ^rei_properties/ URL-адреса.

, views.rei_properties_del, name='rei_properties_del'),

и, наконец, мои представления удаления и редактирования:


Ответ №1:

менять ,


Для


Атрибут имени URL-адреса используется для прямой связи вызова из шаблона, а не для создания формата URL-адреса…

ДОБАВЛЕНО, я бы посоветовал вам назвать свое приложение в urls.py как ,

urls.py


и из шаблонов вы можете ссылаться на конкретный URL-адрес конкретного приложения, потому что в разных приложениях может быть одно и то же имя URL-адреса… Нравится ,


Комментарии:

1. Еще одна проблема заключается в том , что у OP есть шаблон ^rei_properties/ , который также будет соответствовать шаблону ^rei_properties/edit/(?P<pk>[0-9]{1,10})/$ и удалению, потому что он не заканчивается на a $ , поэтому первое представление будет использоваться для всех 3 URL-адресов.

2. Удаление объекта должно выполняться с помощью запроса POST или запроса на УДАЛЕНИЕ, а не запроса GEt.

3. Это было потому, что я не добавил $ в конце ^rei_properties/ URL-адреса.