a-roomana / django-jalali-date

Jalali Date support for user interface. Easy conversion of DateTimeFiled to JalaliDateTimeField within the admin site, views, forms and templates.
MIT License
314 stars 33 forks source link

راه حل مشکل inline formset #45

Open alighiasi opened 3 years ago

alighiasi commented 3 years ago

سلام وقتی فایل django_jalali.min.js قبل از فایل جی کوئری و جی کوئری یو ای در صفحه لود میشه در فرمهای inline formset مشکل ذخیره تاریخ بشکل شمسی در دیتا بیس رخ میدهد فکر میکنم چون در تعریف inline formset ما از widgets استفاده میکنیم جنگو سبب لود شدن زود هنگام django_jalali.min.js میشود ممنون میشم اگه برای این مشکل راهنمایی کنید

a-roomana commented 3 years ago

در مورد پنل ادمین جنگو صحبت می‌کنید یا یک فرم کاستوم؟ من فرض میکنم در مورد یک فرم کاستوم سوال پرسیدید

بنا به هر دلیلی اگه مشکلی در لود شدن فایل های جاواسکریپتی شما وجود داشته باشد، اگر از یک JalaliDateField استفاده می‌کنید نباید در ذخیره سازی آن مشکلی وجود داشته باشد (در فرم به شکل شمسی وارد میشود و در دیتابیس به شکل میلادی ذخیره میشود)، چرا که از jqueryUi صرفا برای نمایش Datepicker استفاده شده است نه تبدیل تاریخ. پس اگر در تبدیل تاریخ به اشکال میخورد، احتمالا باید داکیومنت ها رو مجددا بررسی فرمایید.

همانگونه که در مثال های داکیومنت مشخص هست فایل django_jajali.min.js خودش شامل jquery, jqueryUi, main.js نیز هست. پس در فرم های کاستوم توصیه میشه که یا خودتون این ها رو مطابق با داکیومنت به صورت جداگانه لود کنید یا در انتهای تمپلیت لود کنید تا احتمال کانفلیکت کمتر بشه

alighiasi commented 3 years ago

سلام و سپاس از وقتی که گذاشتین و زحمتی که میکشید در خصوص فرم کاستوم مشکل دارم توی ادمین همه چی درسته . شما در کامنتها فرمودین تاریخ در دیتابیس بایستی میلادی ذخیره بشه تاریخهایی که از پنل ادمین ثبت میشند همه میلادی هستند و موقع نمایش شمسی دیده میشند ولی تاریخی که از طریق کدهای زیر ثبت میشه بشکل شمسی توی دیتابیس ذخیره میشه و من فکر کردم شاید به خاطر وابستگی فایلهای جاوااسکریپت و لود نشدن به موقع فایلها اتفاق افتاده کدهای من به این شکله

forms.py

class BillForm(forms.ModelForm):

    class Meta:
        model = Bill
        fields = ('pay_date', 'amount', 'bill_number', 'bank_name', 'insurance_id' )

    def __init__(self, *args, **kwargs):
        super(BillForm, self).__init__(*args, **kwargs)
        self.fields['pay_date'] = JalaliDateField(label='تاریخ پرداخت', widget=AdminJalaliDateWidget)

CustomerBillsFormset = inlineformset_factory(Customer, Bill,  extra = 2, form = BillForm,  )

views.py

class CustomerBillsEditView(SingleObjectMixin, FormView):

    model = Customer
    template_name = 'customers/customer_bills_edit.html'

    def get(self, request, *args, **kwargs):
        self.object = self.get_object(queryset=Customer.objects.all())
        return super().get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.object = self.get_object(queryset=Customer.objects.all())
        return super().post(request, *args, **kwargs)

    def get_form(self, form_class=None):
        return CustomerBillsFormset(**self.get_form_kwargs(), instance=self.object)

    def form_valid(self, form):
        form.save()

        messages.add_message(
            self.request,
            messages.SUCCESS,
            'تغییرات ذخیره شدند'
        )

        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('accounts:customer_detail', kwargs={'pk': self.object.pk})

customer_bills_edit.html

{% extends 'registration/base_admin.html' %}
{% load static %}
{% load widget_tweaks %}
{% load jalali_tags %}

{% load crispy_forms_tags %}
{% block content %}
<form action="" method="POST" enctype="multipart/form-data">
              {% for hidden_field in form.hidden_fields %}
                {{ hidden_field.errors }}
                {{ hidden_field }}
              {% endfor %}
              {% csrf_token %}
              {{ form.management_form }}
              {{ form.non_form_errors }}
              {% for child_form in form.forms %}
                  <hr>
                  <h5>
                    {% if child_form.instance.id %}
                      فیش پرداختی: {{ child_form.instance.insurance_id }}
                    {% else %}
                      {% if form.forms|length > 1 %}
                        فیش پرداختی جدید
                      {% else %}
                        فیش جدید
                      {% endif %}
                    {% endif %}
                  </h5>
                  {% for hidden_field in child_form.hidden_fields %}
                    {{ hidden_field.errors }}
                  {% endfor %}
                  <div class="row">
                    <div class="col-lg-4 col-md-4 col-xs-12">
                      {{ child_form.pay_date.errors }}
                      {{ child_form.pay_date | as_crispy_field  }}
                    </div>
                    <div class="col-lg-4 col-md-4 col-xs-12">
                      {{ child_form.amount.errors }}
                      {{ child_form.amount | as_crispy_field }}
                    </div>
...
              {% endfor %}
                <button type="submit" value="Update collection" class="btn btn-primary w-100 mb-3">ثبت</button>
                <a href="{{ customer.get_absolute_url  }}" role="button" class="btn btn-secondary w-100">بازگشت</a>
              </p>
            </form>
<link rel="stylesheet" href="{% static 'admin/jquery.ui.datepicker.jalali/themes/base/jquery-ui.min.css' %}">
<script src="{% static 'admin/js/django_jalali.min.js' %}"></script>
{{ form.media }}
{% endblock content %}
a-roomana commented 3 years ago

من حدس میزنم که مشکل از CustomerBillsEditView هست و نیاز به دیباگ کردن داره. برای دیباگ کردن پیشنهاد میکنم، اول کلا از JalaliDateField استفاده نکنید و چک کنید آیا فرمست به درستی کار میکنه؟ آیا مقادیر غیر معتبر به اون بدید به شما به درستی اررور میده؟ آیا مقادیر به درستی ویرایش یا ایجاد میشن؟ من حدس میزنم که در یکی از این قسمت ها بدون JalaliDateField هم مشکل داره.

alighiasi commented 3 years ago

سلام مهندس عزیز ممنونم از راهنمایی شما مشکل حل شد که سر فرصت اینجا توضیح میدم فقط یک باگی توی تبدیل تاریخهای خاص مثل دوم فروردین هزاروچهارصد وجود داره 2021/3/22 و این خطا رو میده couldn't be interpreted in time zone Asia/Tehran, it may be ambiguous or it may not exist 00:00:00 2021-03-22 سپاسگزارم