Reputation: 321
I am writing a small blog and I will like to have a page through which I will be updating the website without going to the admin panel but it seems am not getting something right. I've written a view function but it is not responding yet. Am getting an error saying: The view music.views.upload didn't return an HttpResponse object. It returned None instead. Below is my models.py file
class UserUpload(models.Model):
artist = models.CharField(max_length=300)
title = models.CharField(max_length=200, unique=True)
slug = models.SlugField(default='', blank=True, unique=True)
thumbnail = models.ImageField(blank=False)
audio_file = models.FileField(default='')
music_tag = models.ManyToManyField(MusicTag)
uploaded_date = models.DateTimeField(default=timezone.now)
page_views = models.IntegerField(default=0)
moderation = models.BooleanField(default=False)
class Meta:
ordering = ['-uploaded_date']
def save(self):
self.uploaded_date = timezone.now()
self.slug = slugify(self.title)
super(UserUpload, self).save()
def __str__(self):
return self.title + ' by ' + self.artist
def get_absolute_url(self):
return reverse('music:detail', kwargs={'slug': self.slug})
This is my views.py file
def upload(request):
if request.method == 'POST':
AUDIO_FILE_TYPE = ['wav', 'mp3', 'ogg']
IMAGE_FILE_TYPE = ['png', 'jpg', 'jpeg']
form = UserMusicForm(request.POST or None, request.FILES or None)
if form.is_valid():
form.save(commit=False)
form.artist = request.POST.get('artist')
form.title = request.POST.get('title')
form.thumbnail = request.POST.FILES('thumbnail')
form.audio_file = request.POST.FILES('audio_file')
form.music_tag = request.POST.get('music_tag')
messages.success(request, 'has been successfully uploaded')
if form.thumbnail.url.split('.')[-1] not in IMAGE_FILE_TYPE:
context = {
"form": form,
"message": "Image file must be PNG, JPG, or JPEG"
}
return render(request, "music/upload1.html", context)
if form.audio_file.url.split('.')[-1] not in AUDIO_FILE_TYPE:
context = {
"form": form,
"message": "Audio file must be WAV, MP3, or OGG"
}
return render(request, "music/upload1.html", context)
print("Remaining save")
form.save()
return redirect('/')
else:
form = UserMusicForm(request.POST or None, request.FILES or None)
context = {
"form": form,
"title": "Upload Your Song",
}
return render(request, "music/upload1.html", context)
This is my html file
<div class="login-box">
<h2>Upload Your Song</h2>
<form action="" method="POST">{% csrf_token %}
<div class="user-box">
<input type="text" name="artist" required="required">
<label>Artist</label>
</div>
<div class="user-box">
<input type="text" name="title" required="">
<label>Title</label>
</div>
<div class="user-box">
<input type="file" name="thumbnail" required="">
<label>Thumbnail</label>
</div>
<div class="user-box">
<input type="file" name="audio_file" required="">
<label>Audio file</label>
</div>
<div class="user-box">
<input type="text" name="music_tag" required="">
<label>Music tag</label>
</div>
<button style="background: linear-gradient(360deg, transparent, #03e9f4);" type="submit">Submit</button>
</form>
</div>
Below is my form
class UserMusicForm(forms.ModelForm):
class Meta:
model = UserUpload
fields = ('artist', 'title', 'thumbnail', 'audio_file', 'music_tag')
Upvotes: 1
Views: 484
Reputation: 1965
You don't have an else
statement for if form.is_valid():
, causing the code to return nothing (None
) when your form is invalid. You should return an error response in that case. You can access the errors using Form.errors
(docs).
Upvotes: 1