Как заставить администратора Django обновлять имя файла

Мой django сервер использует дату создания файла в качестве имени файла в админке. Файлы добавляются как программно, так и пользователем. В последнем случае мой django сервер всегда использует временную метку запуска сервера. Как я могу изменить это, чтобы использовать временную метку создания файла?

enter image description here

admin.py

from django.contrib import admin
from .models import SyncScriptLog
from django.core.management import call_command


class SyncScriptLogAdmin(admin.ModelAdmin):
    actions = ['make_sync']

    def make_sync(self, request, queryset):
        call_command('update_rdf_from_api', "90", int(request.POST['_selected_action']))
        messages.add_message(
            request, messages.INFO, 'Amazing synchronization from multiple API sources to RDF TripleStore is DONE!')
    make_sync.short_description = "Run Sync from API to RDF"
    make_sync.acts_on_all = True

admin.site.register(SyncScriptLog, SyncScriptLogAdmin)

models.py

from django.db import models
from datetime import datetime

class SyncScriptLog(models.Model):
    title = models.CharField(max_length=20, default=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), editable=False)
    content = models.TextField()

    def __str__(self):
        return self.title
class SyncScriptLogAdmin(admin.ModelAdmin):
    list_display = ('get_title',)

    def get_title(self, obj):
        return obj.title

    actions = ['make_sync']

    def make_sync(self, request, queryset):
        call_command('update_rdf_from_api', "90", int(request.POST['_selected_action']))
        messages.add_message(
            request, messages.INFO, 'Amazing synchronization from multiple API sources to RDF TripleStore is DONE!')
    make_sync.short_description = "Run Sync from API to RDF"
    make_sync.acts_on_all = True

admin.site.register(SyncScriptLog, SyncScriptLogAdmin)

Вы не должны устанавливать default=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), так как это приведет к оценке выражения, когда он интерпретирует файл в первый раз, а затем продолжит использовать это значение по умолчанию.

Вы можете передать callable параметру default=… [Django-doc], и пусть он возвращает значение, так:

from django.db import models
from django.utils.timezone import now

def generate_title():
    return now().strftime('%Y-%m-%d %H:%M:%S')

class SyncScriptLog(models.Model):
    title = models.CharField(max_length=20, default=generate_title, editable=False)
    # …
Вернуться на верх