[Python] How in Django panel redirect button don't work

Discussão em 'Python' iniciado por Stack, Setembro 27, 2024.

  1. Stack

    Stack Membro Participativo

    I have this code in admin.py

    @admin.register(BaseFundElement)
    class BaseFundElementAdmin(admin.ModelAdmin):
    list_display = ['registration_date', 'inventory_number', 'author', 'title', 'year', 'invoice_number',
    'publication_status']
    readonly_fields = ['id', 'registration_date', 'inventory_number', 'price', 'author', 'title', 'year',
    'price_with_vat', 'vat_amount', 'invoice_number', 'invoice_date', 'publication_status']
    fields = ['id', 'registration_date', 'inventory_number', 'author', 'title', 'year', 'invoice_number',
    'publication_status']

    labels = {
    'currency': 'Издание'
    }

    change_form_template = "klib/create_act.html"

    def create_act(self, request, object_id):
    base_fund_element = self.get_object(request, object_id)
    if request.method == "POST":
    write_off_act = WriteOffAct.objects.create()
    return redirect(reverse('admin:klib_writeoffact_change', args=[write_off_act.pk]))
    return self.change_view(request, object_id)

    def get_urls(self):
    urls = super().get_urls()
    custom_urls = [
    path('create_act/<int:eek:bject_id>/', self.admin_site.admin_view(self.create_act), name='create_act'),
    ]
    return custom_urls + urls

    def get_queryset(self, request):
    qs = super().get_queryset(request)

    if 'publication_status__exact' in request.GET:
    return qs
    return BaseFundElement.active.all()

    list_filter = ['publication_status']

    actions = ['mark_as_written_off']

    def author(self, obj: BaseFundElement):
    return obj.arrival.order_edition.edition.author if obj.arrival.order_edition.edition.author else '-'

    author.short_description = _('Author')

    def title(self, obj: BaseFundElement):
    return obj.arrival.order_edition.edition.title if obj.arrival.order_edition.edition.title else '-'

    title.short_description = _('Edition title')

    def year(self, obj: BaseFundElement):
    return obj.arrival.order_edition.edition.year if obj.arrival.order_edition.edition.year else '-'

    year.short_description = _('Year')

    def has_add_permission(self, request, obj=None):
    return False

    def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    extra_context = extra_context or {}
    extra_context['show_save_and_continue'] = False
    extra_context['show_save'] = False
    return super(BaseFundElementAdmin, self).changeform_view(request, object_id, extra_context=extra_context)

    def has_edit_permission(self, request, obj=None):
    return False

    def edition(self, obj: BaseFundElement):
    return obj.arrival if obj.arrival else ''

    @transaction.atomic
    def save_model(self, request, obj, form, change):
    if obj.pk is None:
    obj.save()

    super().save_model(request, obj, form, change)

    @transaction.atomic
    def mark_as_written_off(self, request, queryset):
    updated_count = queryset.update(publication_status=BaseFundElement.PUBLICATION_STATUS_WRITTEN_OFF)
    self.message_user(request, f"{updated_count} изданий успешно списаны.")

    mark_as_written_off.short_description = _('Списать выбранные издания')


    my_admin_site.register(BaseFundElement, BaseFundElementAdmin)


    The main problem is related to this code

    change_form_template = "klib/create_act.html"

    def create_act(self, request, object_id):
    base_fund_element = self.get_object(request, object_id)
    if request.method == "POST":
    write_off_act = WriteOffAct.objects.create()
    return redirect(reverse('admin:klib_writeoffact_change', args=[write_off_act.pk]))
    return self.change_view(request, object_id)

    def get_urls(self):
    urls = super().get_urls()
    custom_urls = [
    path('create_act/<int:eek:bject_id>/', self.admin_site.admin_view(self.create_act), name='create_act'),
    ]
    return custom_urls + urls

    def get_queryset(self, request):
    qs = super().get_queryset(request)

    if 'publication_status__exact' in request.GET:
    return qs
    return BaseFundElement.active.all()


    I want a form with a model to open when I click on the button, which I will fill out

    But it can't be done. Here is the model that I want the redirect to come to

    @admin.register(WriteOffAct)
    class WriteOffActAdmin(admin.ModelAdmin):
    list_display = ('basis_for_write_off', 'total_excluded', 'submitted_by', 'registered_by')

    fieldsets = (
    (None, {
    'fields': ('basis_for_write_off',)
    }),
    ('Исключить из фонда', {
    'fields': ('journal_1_count', 'journal_2_count', 'journal_3_count')
    }),
    ('Всего исключено из фонда', {
    'fields': ('total_excluded',)
    }),
    ('По содержанию изданий', {
    'fields': ('socio_economic_count', 'technical_count', 'other_count', 'railway_theme_count')
    }),
    ('Состав комиссии', {
    'fields': ('chairman', 'vice_chairman', 'member_1', 'member_2', 'member_3')
    }),
    ('Ответственные лица', {
    'fields': ('submitted_by', 'registered_by')
    }),
    )

    readonly_fields = ['total_excluded']
    form = WriteOffActForm


    my_admin_site.register(WriteOffAct, WriteOffActAdmin)


    class WriteOffAct(models.Model):
    basis_for_write_off = models.CharField(max_length=255, verbose_name="Основание списания")
    journal_1_count = models.PositiveIntegerField(default=0, verbose_name="Количество экземпляров Журнал 1")
    journal_2_count = models.PositiveIntegerField(default=0, verbose_name="Количество экземпляров Журнал 2")
    journal_3_count = models.PositiveIntegerField(default=0, verbose_name="Количество экземпляров Журнал 3")
    total_excluded = models.PositiveIntegerField(default=0, editable=False, verbose_name="Всего исключено из фонда")
    socio_economic_count = models.PositiveIntegerField(default=0, verbose_name="Социально-экономические")
    technical_count = models.PositiveIntegerField(default=0, verbose_name="Техника")
    other_count = models.PositiveIntegerField(default=0, verbose_name="Прочие")
    railway_theme_count = models.PositiveIntegerField(default=0, verbose_name="По железнодорожной тематике")
    chairman = models.IntegerField(null=True, verbose_name="Председатель комиссии")
    vice_chairman = models.IntegerField(null=True, verbose_name="Зам. председателя комиссии")
    member_1 = models.IntegerField(null=True, verbose_name="Член комиссии 1")
    member_2 = models.IntegerField(null=True, verbose_name="Член комиссии 2")
    member_3 = models.IntegerField(null=True, verbose_name="Член комиссии 3")
    submitted_by = models.IntegerField(verbose_name="Списанные документы сдал(а)")
    registered_by = models.IntegerField(verbose_name="В книге суммарного учёта акт проведен")

    def save(self, *args, **kwargs):
    self.total_excluded = self.journal_1_count + self.journal_2_count + self.journal_3_count
    super().save(*args, **kwargs)

    class Meta:
    app_label = 'klib'
    verbose_name = "Акт списания"
    verbose_name_plural = "Акты списания"


    here is the code of the button itself, which is used in my application jazzmin

    {% extends "admin/change_form.html" %}

    {% block object-tools %}
    {{ block.super }}
    <div class="submit-row" style="display: flex; flex-direction: column; gap: 10px; padding-top: 15px;">
    <form method="post" action="{% url 'admin:create_act' object_id=original.id %}">
    {% csrf_token %}
    <input type="submit" value="Сформировать акт" class="btn btn-success form-control">
    </form>
    </div>
    {% endblock %}


    My the option did not work

    change_form_template = "klib/create_act.html"

    def create_act(self, request, object_id):
    base_fund_element = self.get_object(request, object_id)
    if request.method == "POST":
    write_off_act = WriteOffAct.objects.create()
    return redirect(reverse('admin:klib_writeoffact_change', args=[write_off_act.pk]))
    return self.change_view(request, object_id)

    def get_urls(self):
    urls = super().get_urls()
    custom_urls = [
    path('create_act/<int:eek:bject_id>/', self.admin_site.admin_view(self.create_act), name='create_act'),
    ]
    return custom_urls + urls

    Continue reading...

Compartilhe esta Página