Я использую 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 %}
Я хочу, чтобы новый файл заменил старый файл в корне мультимедиа, а не просто добавляя новый файл в корень мультимедиа.