Как обновить fieldfile, заменив его в реальном каталоге вместо только в базе данных - PullRequest
0 голосов
/ 11 июля 2019

Я использую UpdateView для модели, включающей FileFields, но когда я пытался обновить файлы, он изменяет только базу данных, а не базу данных и фактический каталог.

Например: если у меня есть три файла в корне мультимедиа (media / uploads / id), когда я использую UpdateView для замены одного из них, база данных работает нормально, но в моем файле будет четыре файлаКорень мультимедиа, который включает новый файл без удаления старого.

def upload_to(instance, filename):
    return 'uploads/{id}/{fn}'.format(id=instance.pk,fn=filename)

class Mechanism(models.Model):
    """
    A chemical kinetic mechanism, from Chemkin or Cantera
    """
    ck_mechanism_file = models.FileField(upload_to=upload_to, max_length=100, blank=True, null=True,
                                       verbose_name="Chemkin mechanism file")
    ck_thermo_file = models.FileField(upload_to=upload_to, max_length=100, blank=True, null=True,
                                       verbose_name="Chemkin thermo file")
    ck_transport_file = models.FileField(upload_to=upload_to, max_length=100, blank=True, null=True,
                                       verbose_name="Chemkin transport file")
    ck_surface_file = models.FileField(upload_to=upload_to, max_length=100, blank=True, null=True,
                                       verbose_name="Chemkin surface file")
    ct_mechanism_file = models.FileField(upload_to=upload_to, max_length=100, blank=True, null=True,
                                        verbose_name='Cantera yaml file')
    ct_conversion_errors = models.TextField(verbose_name='Errors from the ck2yaml conversion')
    timestamps = models.DateTimeField(auto_now_add=True)

class MechanismObjectMixin(object):
    model = Mechanism
    def get_object(self):
        pk = self.kwargs.get('pk')
        obj = None
        if pk is not None:
            obj = get_object_or_404(self.model, pk=pk)
        return obj

class MechanismUpdateView(MechanismObjectMixin, View):
    template_name="file_update.html"
    def get(self, request, id=id, *args, **kwargs):
        context = {}
        obj = self.get_object()
        if obj is not None:
            form = ChemkinUpload(instance=obj)
            context['object'] = obj
            context['form'] = form
        return render(request, self.template_name, context)

    def post(self, request, *args, **kwargs):
        obj = self.get_object()
        form = ChemkinUpload(request.POST, request.FILES, instance=obj)
        if form.is_valid():
            form.save()
            url = reverse_lazy('mechanism-detail', args=[obj.pk])
            return HttpResponseRedirect(url)
{% extends 'base.html' %}

{% block content %}
<h1>Update: {{object.pk }}</h1>

<form action='update' method='POST' enctype="multipart/form-data">{% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-primary btn-sm">Save</button>
</form>

{% endblock %}

Я хочу, чтобы новый файл заменил старый файл в корне мультимедиа, а не просто добавляя новый файл в корень мультимедиа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...