#python #django #django-forms #htmx
#питон #джанго #джанго-формы #htmx
Вопрос:
У меня есть следующие модели, и, как вы можете видеть, они связаны друг с другом
class Leads(models.Model): project_id = models.BigAutoField(primary_key=True, serialize=False) created_at = models.DateTimeField(auto_now_add=True) expected_revenue = MoneyField(decimal_places=2,max_digits=14, default_currency='USD') expected_licenses = models.IntegerField() country = CountryField(blank_label='(select_country)') status = models.CharField(choices=[('Open', 'Open'), ('Closed', 'Closed'), ('Canceled', 'Canceled'), ('Idle', 'Idle') ], max_length=10) estimated_closing_date = models.DateField() services = models.CharField(choices=[('Illumination Studies', 'Illumination Studies'), ('Training', 'Training'),('Survey Design Consultancy', 'Survey Design Consultancy'), ('Software License', 'Software License'), ('Software Development','Software Development')], max_length=40) agent = models.ForeignKey(Profile, default='agent',on_delete=models.CASCADE) company = models.ForeignKey(Company,on_delete=models.CASCADE) point_of_contact = models.ForeignKey(Client, default='agent',on_delete=models.CASCADE) updated_at = models.DateTimeField(auto_now=True) application = models.CharField(choices=[('Oamp;G','Oamp;G'),('Renewables','Renewables'),('Mining','Mining'), ('Other','Other'),('CSS','CSS')], default='Oamp;G',max_length=20) sub_category = models.CharField(choices=[('Wind','Wind'),('Geo-Thermal','Geo-Thermal'),('Solar','Solar'), ('Tidal','Tidal')], max_length=20, blank=True) @property def age_in_days(self): today = date.today() result = self.estimated_closing_date - today return result.days def __str__(self): return f'{self.project_id}' class LeadEntry(models.Model): revenue = MoneyField(decimal_places=2,max_digits=14, default_currency='USD',blank=True) date = models.DateField() lead_id = models.ForeignKey(Leads,on_delete=models.CASCADE) id = models.BigAutoField(primary_key=True, serialize=False) probability = models.DecimalField(max_digits=2, decimal_places=2, default=0, blank=True) @property def est_revenue(self): result = self.revenue * probabiity return result
По сути, запись о лидах связана с лидом, и я использую HTMX для добавления данных в базу данных LeadEntry с помощью формы.
Форма
class LeadEntryForm(forms.ModelForm): class Meta: model = LeadEntry fields = ('lead_id','date','revenue','probability') widgets = {'date': DateInput()}
У меня есть 2 представления, одно из которых просто передаст HTML-код с кнопкой, чтобы пользователь мог добавлять записи в базу данных, и другое представление с фактической формой
число просмотров
@login_required def add_to_forecast(request): id = request.GET.get('project_id') request.session['lead_id'] = id return render(request, 'account/lead_forecast.html') @login_required def forecast_form(request): if request.method=='POST': form = LeadEntryForm(data=request.POST or None) if form.is_valid(): form.save(commit=False) messages.success(request,"Successful Submission") return redirect('add_to_forecast') lead_id = request.session['lead_id'] data = {'lead_id':lead_id} context = { "form":LeadEntryForm(initial=data) } return render(request, 'account/lead_entry_forecast.html', context)
Lastly, there are 2 HTML pages, the first one is associated with add_to_forecast and renders a simple page, this is where the HTMX happens and this adds the form from the next HTML page
{% extends "base.html" %} {% load crispy_forms_tags %} {% load static %} {% block title %}Client Information {% endblock %} {% block content %} lt;h1gt; Add Lead to Sales Forecast lt;/h1gt; lt;pgt;Click the Button below to add a Payment Datelt;/pgt; lt;button type="button" hx-get="{% url 'lead_entry_forecast' %}" hx-target="#leadform" hx-swap="beforeend" gt; Add Lead lt;/buttongt; lt;div id="leadform"gt; lt;brgt; lt;/divgt; {% endblock %}
The form that is added by the user as many times they want to do so
{% load crispy_forms_tags %} {% load static %} {% block content %} lt;div class="container-fluid"gt; lt;form method="post" enctype="multipart/form-data" action="."gt; {% csrf_token %} lt;div class="row justify-content-center"gt; lt;div class="col-sm-1"gt; {{ form.lead_id|as_crispy_field }} lt;/divgt; lt;div class="col-sm-2"gt; {{ form.date|as_crispy_field }} lt;/divgt; lt;div class="col-sm-2"gt; {{ form.revenue|as_crispy_field }} lt;/divgt; lt;div class="col-sm-1"gt; {{ form.probability|as_crispy_field }} lt;/divgt; lt;div class="col-sm"gt; lt;input type="submit" value="Submit" gt; lt;/divgt; lt;/divgt; lt;/formgt; lt;/divgt; lt;hrgt; {% endblock %}
Проблема у меня в том, что после отправки формы все, кажется, работает, очевидно, на данный момент вы можете отправить только один запрос, так как мне все еще нужно добавить больше логики, но на данный момент форма не отправляет данные в БД, после некоторой отладки я не смог передать СООБЩЕНИЕ, похоже, что просто ничего не отправляю.
Любая помощь будет высоко оценена
Обновление — 12/4/2021
Я попытался отправить данные с помощью формы, и это действительно работает, так что нет ничего плохого в том, что форма отправила сообщение.запрос, если я перейду непосредственно по URL-адресу, он работает нормально, поэтому форма отправлена правильно и база данных обновляется.
Я все еще не понимаю, почему не работает, когда форма отображается htmx, так что это как-то связано с этим.
Ответ №1:
Когда вы разрабатываете страницу HTMX, вы должны быть осторожны с запросом на публикацию, поэтому я обрабатывал форму в неправильном представлении, пожалуйста, смотрите ниже представления:
@login_required def add_to_forecast(request): form = LeadEntryForm(data=request.POST or None) if request.method == 'POST': if form.is_valid(): form.save() return HttpResponse("Success") else: return render(request, 'account/lead_entry_forecast.html', {"form": form}) id = request.GET.get('project_id') request.session['lead_id'] = id return render(request, 'account/lead_forecast.html') @login_required def forecast_form(request): lead_id = request.session['lead_id'] data = {'lead_id':lead_id} context = { "form":LeadEntryForm(initial=data) } return render(request, 'account/lead_entry_forecast.html', context)
Теперь все работает так, как должно