On Wed, Jan 17, 2018 at 11:53 AM, Tony <[email protected]> wrote:
> I would like to let users either upload a video file(to AWS S3) or provide > an URL to a video, e.g. Youtube/Vimeo. > > > I found a similar question for Rails: Rails: upload a file OR store a url > <https://stackoverflow.com/questions/13547724/rails-upload-a-file-or-store-a-url> > > > > <https://stackoverflow.com/questions/13547724/rails-upload-a-file-or-store-a-url> > > But how do I do that in Django(1.11)? > > > Should I create 2 separate models, or model inheritance with abstract > model, let users choose what they want to do in the frontend, then display > the appropriate form? > > class VideoModel(models.Model): > title = models.CharField(max_length=200) > post_by = models.OneToOneField(settings.AUTH_USER_MODEL) > created = models.DateTimeField(auto_now_add=True) > modified = models.DateTimeField(auto_now=True) > > class Meta: > abstract = True > class VideoFile(VideoModel): > video = models.FileField(upload_to='uploads/') > class Videolink(VideoModel): > URL = URLField(max_length=200) > > > Would it be better if there is only 1 model with both a FileField and > URLField. > IMO, yes, indeed > They are both set to blank = true. Put a message on the page, saying > either upload a file or provide a Youtube link. In the backend, check the > request.POST whether one of these fields is filled in, if not, render the > form again with an error message. > class VideoModel(models.Model): title = models.CharField(max_length=200) post_by = models.OneToOneField(settings.AUTH_USER_MODEL) created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) video = models.FileField(upload_to='uploads/', blank=True, null=True) url = URLField(max_length=200, blank=True, null=True) def clean(self): super().clean() if not self.url and not self.video: raise(ValidationError({"url": "Both url and video can't be null"}) def get_video_url(self): return(url if self.url else self.video.url) This is a way of doing it. If you use a ModelForm, then it will show the error message automatically. You can add some javascript for showing only the one that was chosen. You should have for convenience a function or method that return the url for the video independently of the source. > > Which one is better to handle such situation? Or they are equally > horrible? I couldn't think of a third option. > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/django-users. > To view this discussion on the web visit https://groups.google.com/d/ > msgid/django-users/31186b81-e108-47f9-8594-a140dcad3097%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/31186b81-e108-47f9-8594-a140dcad3097%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CA%2BFDnhJuyZGN9_nSbmOoZcknxA3r8LFFRPEx3QQQj9bwPx8hZA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

