Создание объекта и отображение его на одной странице с htmx
Функция, которую я пытаюсь реализовать, заключается в том, что когда форма отправляется в представлении create, я хотел бы отобразить созданный объект под ней без обновления страницы. Я знаю, что это можно реализовать через HTMX. Создаваемый объект - это ключ, который является уникальным и генерируется случайным образом. Однако он не работает должным образом. В данный момент при первом нажатии на кнопку создается ключ и отображается, но при втором нажатии он пытается показать предыдущий ключ, а поскольку он уже существует, он не уникален и поэтому ничего не показывает.
Это модель
class Key(models.Model):
key = models.CharField(max_length=10, null=False, default=get_random_string(length=10), unique=True)
amount = models.IntegerField(default=1)
created = models.DateTimeField(auto_now_add=True)
def get_absolute_url(self):
return reverse("key", kwargs={"id": self.id })
У меня есть два представления, представление создания и представление деталей, я бы хотел использовать CBV, но не могу понять, как это реализовать, поэтому я придерживаюсь представлений на основе функций. Сейчас представления выглядят следующим образом
@login_required
def key_create_view(request):
form = CreateKeyForm(request.POST or None)
context = {
"form": form,
}
if form.is_valid():
obj = form.save(commit=False)
obj.save()
kod_url = reverse('key', kwargs={'id':obj.id})
if request.htmx:
context = {
"object": obj,
"key_url": key_url
}
return render(request, "base/components/key.html", context)
#return redirect(obj.get_absolute_url())
return render(request, "base/form.html", context)
@login_required
def key_detail_hx_view(request, id=None):
if not request.htmx:
raise Http404
try:
obj = Key.objects.get(id=id)
except:
obj = None
if obj is None:
return HttpResponse("Something went wrong")
context = {
"object": obj
}
return render(request, "base/components/key.html", context)
В шаблоне я построил его следующим образом
<form action="" method="POST">
{% csrf_token %}
<div id="key" class="text-center">
<button hx-post="{{key.url}}" hx-target="#key" hx-swap="beforeend" type="submit">Create new key</button>
</div>
</form>
Я бы хотел, чтобы при каждом нажатии кнопки генерировался новый ключ и заменял предыдущий. Кто-нибудь знает, как я могу это реализовать?
Конечной точкой hx-post формы, создающей ключ, должен быть key_create_view, а не ключ, отображающий представление. На самом деле, на странице формы {{ key_url }} пусто. Более того, поскольку вы хотите показать только последний сгенерированный ключ, метод замены должен быть по умолчанию innerHTML, поэтому HTMX заменит содержимое внутри div #key новым.
<form action="" method="POST">
{% csrf_token %}
<div class="text-center">
<button hx-post="{% url 'create_key' %}" hx-target="#key" type="submit">Create new key</button>
</div>
</form>
<!-- HTMX will swap the returned key here -->
<div id="key"></div>