Search code examples
djangodjango-modelsdjango-formsdjango-viewsslug

Keep getting 404 error and "No User matches the given query." message on form submission


I am trying to let my user post onto a project page, however when submitting the post form I get a 404 and the message "No User matches the given query." I am also not sure If I have got my form_valid part correct.

I want my user to be able to make posts on different project pages they have and for each post to be related to the correct project.

Any help and example code would be much appreciated!

views

class NewPost(CreateView):
    model = ProjectPost
    form_class = ProjectPostForm
    template_name = 'howdidu/new_post.html'

    def form_valid(self, form):
        self.object = form.save(commit=False)
        project = UserProject.objects.get(slug=self.kwargs["slug"])
        self.object.project = project
        self.object.save()
        return super(NewPost, self).form_valid(form)

    def get_success_url(self):
        project_username = self.request.user.username
        project_slug = self.object.slug
        return reverse('user_project', kwargs={'username':project_username, 'slug': project_slug})

urls

urlpatterns = patterns('',
        url(r'^$', views.index, name='index'),
        url(r'^register_profile/$', views.register_profile, name='register_profile'),
        url(r'^update_profile/$', views.update_profile, name='update_profile'),
        url(r'^create_project/$', login_required(views.CreateProject.as_view()), name='create_project'),
        url(r'^(?P<username>\w+)/(?P<slug>[-\w]+)/new_post/$', login_required(views.NewPost.as_view()), name='new_post'),
        url(r'^(?P<username>\w+)/(?P<slug>[-\w]+)/update_project/$', login_required(views.UpdateProject.as_view()), name='update_project'),
        url(r'^(?P<username>\w+)/(?P<slug>[-\w]+)/delete_project/$', login_required(views.DeleteProject.as_view()), name='delete_project'),
        url(r'^(?P<username>\w+)/$', views.profile_page, name='user_profile'),
        url(r'^(?P<username>\w+)/(?P<slug>[-\w]+)/$', views.project_page, name='user_project'),

        )

models

class UserProject(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=100)
    project_overview = models.CharField(max_length=1000)
    project_picture = models.ImageField(upload_to='project_images', blank=True)
    date_created = models.DateTimeField(auto_now_add=True)
    project_views = models.IntegerField(default=0)
    project_likes = models.IntegerField(default=0)
    project_followers = models.IntegerField(default=0)
    slug = models.SlugField(max_length=100, unique=True) #should this be unique or not?

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(UserProject, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.title

class ProjectPost(models.Model):
    project = models.ForeignKey(UserProject)
    title = models.CharField(max_length=100)
    post_overview = models.CharField(max_length=1000)
    date_created = models.DateTimeField(auto_now_add=True)
    post_views = models.IntegerField(default=0)
    post_likes = models.IntegerField(default=0)

forms

#form to add project details
class UserProjectForm(forms.ModelForm):

    class Meta:
        model = UserProject
        fields = ('title', 'project_picture', 'project_overview')

#form to create a post
class ProjectPostForm(forms.ModelForm):

    class Meta:
        model = ProjectPost
        fields = ('title', 'post_overview')

template

{% extends 'howdidu/base.html' %}

{% load staticfiles %}

{% block title %}New Post{% endblock %}

{% block body_block %}

        <h1>Create a new post</h1>

        <form enctype="multipart/form-data" id="ProjectPostForm" method="post" action="/new_post/">
          {% csrf_token %}
          {{ form.as_p }}
          <input type="submit" name="submit" value="Create" />
        </form>


{% endblock %}

Solution

  • You're posting your form to /new_project/, but that doesn't exist in your urls.py. You probably meant /create_project/.