Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
alighiasi opened this issue May 10, 2021 · 4 comments
Open

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

alighiasi opened this issue May 10, 2021 · 4 comments

Comments

@alighiasi
Copy link

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

@a-roomana
Copy link
Owner

a-roomana commented May 10, 2021

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

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

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

@alighiasi
Copy link
Author

alighiasi commented May 11, 2021

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

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
Copy link
Owner

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

@alighiasi
Copy link
Author

سلام مهندس عزیز
ممنونم از راهنمایی شما
مشکل حل شد که سر فرصت اینجا توضیح میدم
فقط یک باگی توی تبدیل تاریخهای خاص مثل دوم فروردین هزاروچهارصد وجود داره
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
سپاسگزارم

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants