Я не могу удалить определенный элемент из таблицы в шаблоне/ представлении 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/")
Попробуйте и посмотрите, решит ли это вашу ошибку