Advertisement
horozov86

Uploading of many file in Django App

Jun 17th, 2025
602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.97 KB | None | 0 0
  1. Качване на множество файлове във формата независимо дали са снимки или видео?
  2. Чрез единични полета във вече съществуващия модел не работи, понеже по този начин се качват по една снимка и по едно видео.
  3. Решението е да се направи допълнителен модел .....Media, който се свързва с първия модел. В него се добавя поле file = models.FileField и се оказва, къде ще се качват файловете.
  4.  
  5. Пример:
  6. Първи модел
  7.  
  8. django.contrib.auth import get_user_model
  9. from django.db import models
  10. from django.utils import timezone
  11.  
  12. UserModel = get_user_model()
  13.  
  14.  
  15. class Publication(models.Model):
  16.     location = models.CharField(
  17.         max_length=200,
  18.         null=True,
  19.         blank=True,
  20.     )
  21.  
  22.     description = models.TextField(
  23.         null=False,
  24.         blank=False,
  25.     )
  26.  
  27.  
  28.     weight_kg = models.FloatField(
  29.         null=True,
  30.         blank=True,
  31.     )
  32.  
  33.     created_at = models.DateTimeField(
  34.         default=timezone.now,
  35.     )
  36.  
  37.     user = models.ForeignKey(UserModel, on_delete=models.CASCADE)
  38.  
  39.  
  40. Втори модел
  41.  
  42. class PublicationMedia(models.Model):
  43.     MEDIA_TYPE_CHOICES = (
  44.         ('image', 'Image'),
  45.         ('video', 'Video'),
  46.     )
  47.     publication = models.ForeignKey(Publication, on_delete=models.CASCADE)
  48.     file = models.FileField(upload_to='files/')
  49.     media_type = models.CharField(max_length=5, choices=MEDIA_TYPE_CHOICES)
  50.  
  51.  
  52. Формата не се променя и не й се добавя допълнителни полета. С добавено допълнително поле не работи, понеже това поле идва от другия модел. Остава си така:
  53.  
  54. class PublicationBaseForm(forms.ModelForm):
  55.     class Meta:
  56.         model = Publication
  57.         fields = ["location", "description", "weight_kg"]
  58.         widgets = {
  59.             'location': forms.TextInput(attrs={'placeholder': 'Enter your fishing location'}),
  60.             'description': forms.Textarea(attrs={'placeholder': 'Enter a description of your fishing experience'}),
  61.             'weight_kg': forms.NumberInput(attrs={'placeholder': 'Enter weight of the fish'}),
  62.         }
  63.  
  64.  
  65. След което ръчно се добавя полето за качване на файловете в html-a по този начин:
  66.  
  67. <input type="file" name="media_files" multiple>
  68.  
  69. <input class="publication-create-btn" type="submit" value="Add Publication" />
  70.  
  71. Във view-то в променливата media_files става списък с качените файлове обекти.
  72. Итерира се през всички файлове с for цикъл и се записва всеки един файл в базата свързан с публикацията.
  73.  
  74. @method_decorator(login_required, name='dispatch')
  75. class PublicationCreateView(views.CreateView):
  76.     form_class = PublicationCreateForm
  77.     model = Publication
  78.     template_name = "publications/publication_create.html"
  79.     success_url = reverse_lazy("feed")
  80.  
  81.     def form_valid(self, form):
  82.         self.object = form.save(commit=False)
  83.         self.object.user = self.request.user
  84.         self.object.save()
  85.  
  86.         media_files = self.request.FILES.getlist('media_files') --> списък от фаловете
  87.         for file in media_files: --> итерира се
  88.             content_type = file.content_type
  89.             media_type = 'video' if content_type.startswith('video') else 'image' --> взима се типа на файла
  90.             PublicationMedia.objects.create(
  91.                 publication=self.object,
  92.                 file=file,
  93.                 media_type=media_type
  94.             ) --> създава се обект
  95.  
  96.         return super().form_valid(form)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement