diff --git a/contracts/migrations/0053_alter_contractfile_file.py b/contracts/migrations/0053_alter_contractfile_file.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa0900d944457b4e00028d0ee4a751df7f62d332
--- /dev/null
+++ b/contracts/migrations/0053_alter_contractfile_file.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.1.4 on 2023-04-21 12:10
+
+import contracts.models
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('contracts', '0052_remove_contract_legal_state_contract_is_valid'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='contractfile',
+            name='file',
+            field=contracts.models.ContractFileField(upload_to=contracts.models.get_contract_file_loaction, verbose_name='Soubor'),
+        ),
+    ]
diff --git a/contracts/models.py b/contracts/models.py
index 268cd2008f325ed0f585a7fa784357269abcfd58..72d01d2a5649dcb0ff475234d4d607ae49870e3e 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -2,12 +2,14 @@ import datetime
 import mimetypes
 import os
 import typing
+import uuid
 
 from django.conf import settings
 from django.core.exceptions import ValidationError
 from django.core.validators import RegexValidator, URLValidator
 from django.db import models
 from django.db.models.signals import post_save
+from django.db.models.fields.files import FieldFile
 from django.dispatch import receiver
 from django.urls import reverse
 from django.utils.safestring import mark_safe
@@ -809,15 +811,29 @@ def get_contract_file_loaction(instance, filename):
                 continue
 
             extension = mapper[guessed_type]
+
+            if isinstance(extension, list):
+                extension = extension[0]
+
             break
 
     return (
         "_private/"
         f"{current_time.year}/{current_time.month}/{current_time.day}/"
-        f"{str(instance.id)}{extension}"
+        f"{uuid.uuid4()}{extension}"
     )
 
 
+class ContractFileProxy(FieldFile):
+    @property
+    def url(self) -> str:
+        return reverse("contracts:download_contract_file", args=(str(self.instance.id),))
+
+
+class ContractFileField(models.FileField):
+    attr_class = ContractFileProxy
+
+
 class ContractFile(NameStrMixin, models.Model):
     name = models.CharField(
         max_length=256,
@@ -830,7 +846,7 @@ class ContractFile(NameStrMixin, models.Model):
         verbose_name="Veřejně dostupný",
     )
 
-    file = models.FileField(
+    file = ContractFileField(
         verbose_name="Soubor",
         upload_to=get_contract_file_loaction,
     )