Я не могу удалить определенный элемент из таблицы в шаблоне/ представлении Django

В моем шаблоне есть список адресов кошельков. Когда я попытался удалить адрес, нажав на кнопку удаления, он возвращает сообщение об ошибке. Я думаю, что это ошибка из-за того, как структурирован мой шаблон. Но на самом деле я не знаю. Когда я пытаюсь удалить адрес, вручную вводя id адреса в URL-адрес просмотра удаления, он удаляется. Вот сообщение об ошибке, которое возвращается.

Traceback (most recent call last):
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\fields\__init__.py", line 2018, in get_prep_value
    return int(value)

The above exception (invalid literal for int() with base 10: 'Btc') was the direct cause of the following exception:
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\contrib\auth\decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\admin\Documents\Django\crypto\dashboard\views.py", line 275, in del_wallet
    wallet.delete()
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\base.py", line 1137, in delete
    return collector.delete()
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\deletion.py", line 475, in delete
    query.update_batch(
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\sql\subqueries.py", line 78, in update_batch
    self.get_compiler(using).execute_sql(NO_RESULTS)
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\sql\compiler.py", line 1819, in execute_sql
    cursor = super().execute_sql(result_type)
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\sql\compiler.py", line 1382, in execute_sql
    sql, params = self.as_sql()
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\sql\compiler.py", line 1785, in as_sql
    val = field.get_db_prep_save(val, connection=self.connection)
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\fields\related.py", line 1146, in get_db_prep_save
    return self.target_field.get_db_prep_save(value, connection=connection)
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\fields\__init__.py", line 925, in get_db_prep_save
    return self.get_db_prep_value(value, connection=connection, prepared=False)
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\fields\__init__.py", line 2703, in get_db_prep_value
    value = self.get_prep_value(value)
  File "C:\Users\admin\Documents\Django\env\lib\site-packages\django\db\models\fields\__init__.py", line 2020, in get_prep_value
    raise e.__class__(

Exception Type: ValueError at /dashboard/wallet/2/delete/
Exception Value: Field 'id' expected a number but got 'Btc'.

views.py

@login_required
def wallet(request):
    user = request.user
    wallet=Wallet(user=user)
    object_list = Wallet.objects.filter(user=user)
    # Paginator
    paginator = Paginator(object_list, 2) 
    page = request.GET.get('page')
    try:
        ref = paginator.page(page)
    except PageNotAnInteger:
        ref = paginator.page(1)
    except EmptyPage:
        ref = paginator.page(paginator.num_pages)    
    if request.method == 'POST':
        if 'add' in request.POST:
            form = WalletForm(request.POST, instance=wallet)
            if form.is_valid():
                form.save()
                messages.success(request, ("New wallet address successfully added."))
                return redirect("dashboard:wallet")
    else:
        form = WalletForm(instance=user)
    context = {
        'form': form,
        'ref': ref,
        # 'refe': refe
        # 'del_wallet': del_wallet
    }
    return render(request, 'dashboard/wallet.html', context)


@login_required
def del_wallet(request, pk):
    wallet = get_object_or_404(Wallet, id=pk)
    wallet.delete()
    return redirect("dashboard:wallet")

Первый вид wallet отвечает за то, чтобы позволить пользователям добавить новый кошелек, а также отвечает за отображение кошельков. Логика добавления кошелька осуществляется с помощью всплывающего модала. Второй вид del_wallet отвечает за обработку логики удаления.

urls.py

urlpatterns = [
    path('wallet', wallet, name="wallet"),
    path('wallet/<str:pk>/delete/', del_wallet, name="del_wallet"),
]

Набрав URL и указав id, адрес кошелька с id удаляется. Например, вызов http://localhost "5000/wallet/2/delete/ удаляет адрес с id 2. Но нажатие на кнопку удаления, прикрепленную к каждому кошельку, возвращает сообщение об ошибке, указанное выше. Я добавил оператор print для проверки деталей кошелька, который появляется каждый раз, когда я нажимаю кнопку удаления. Он регистрирует правильный кошелек, на который был сделан щелчок, с его id, но все же возвращает сообщение об ошибке. Я не могу понять, что вызывает ошибку.

wallet.html

models.py

class Wallet(models.Model):
    wallet = (
        ('Btc', 'Bitcoin'), 
        ('Eth', 'Ethereum'), 
        ('Trc20', 'Tether-UDST'), 
        ('Ltc', 'Litecoin') 
)
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    type = models.CharField(choices=wallet, default='Btc') 
    address = models.CharField(max_length=80)

Подскажите, пожалуйста, в чем может быть причина ошибки. Я прочитал много сообщений в Интернете, но ни одно из них не помогло решить мою проблему.

Во-первых, это должно быть <int:pk>, а не <str:pk>, а во-вторых, используйте теги url в тегах якоря так:

<a href="{% url 'dashboard:del_wallet' i.pk %}" style="text-decoration: none;">                      

Лучше изменить url следующим образом:

urlpatterns = [
    path('wallet/', wallet, name="wallet"),
    path('wallet/delete/<int:pk>/', del_wallet, name="del_wallet"),
]

Примечание: Всегда добавляйте / в конце каждого маршрута.

<td class="view" data-bs-toggle="modal" data-bs-target="#wallet{{ i.pk }}">
    <a style="text-decoration: none;" href="{% url 'del_wallet' i.pk %}">
        Delete
    </a>
</td>

принимайте только такую ссылку

<a href="{% url 'del_wallet' i.pk %}" style="text-decoration: none;">
    Confirm
</a>

Удалите это

<button type="submit" class="btn btn-primary btn-sm w-100">
</button>

Просто вы можете попробовать этот способ:

<a href="/dashboard/wdelete/{{i.pk}}" style="text-decoration: none;">

И в вашем urls.py:

path('wdelete/<int:pk>', del_wallet, name="del_wallet"),

И в вашем views.py:

def del_wallet(request, pk):
    wallet = Wallet.objects.get(id=pk)
    wallet.delete()
    return HttpResponseRedirect("/dashboard/wallet/")

Попробуйте и посмотрите, решит ли это вашу ошибку

Вернуться на верх