0

Я не могу решить, как получить правильный экземпляр для части form_valid моего общего представления. Я пытаюсь разрешить пользователю публиковать на стене проекта (как Facebook). Мне нужно, чтобы сообщение было связано с отдельным проектом (у пользователя может быть несколько проектов). Должен ли экземпляр быть pk или заголовок проекта? Любой пример кода или помощи будет очень оценен! Я борюсь с пониманием того, как при создании нового сообщения он знает, с каким проектом будет ассоциироваться.Нужна помощь в получении правильного экземпляра для form_valid в общем представлении

просмотров

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

    def form_valid(self, form): 
     newpost = form.save(commit=False) 
     form.instance.user = self.request.user 
     newpost.save() 
     self.object = newpost 
     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}) 

модели

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) 

формы

#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') 
+0

Можете ли вы показать нам ProjectPostForm? Пользователь собирается выбрать проект (в форме)? – dkarchmer

+0

@davka Я только что добавил формы для вас. Пользователь не выбирает проект в форме. Мне нужно, чтобы пользователь мог перейти на страницу своего проекта, нажмите ссылку «Создать новую запись», которая отобразит их в форме для сообщения. Затем сообщение должно быть сохранено и отображено на странице проекта, на которую они нажали ссылку. – ollysmall

ответ

0

Хорошо, в таком случае я бы рекомендовал URL-то вроде

url(r'^(?P<pk>\d+)/post/add/$', views.NewPostCreateView.as_view(), name='...'), 

, а затем посмотреть, как

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) 

     # Find project by using the 'pk' in the URL 
     project = get_object_or_404(UserProject, pk=self.kwargs['pk']) 

     # Then just set the project on the newPost and save() 
     self.object.project = project 
     self.object.save() 

     return super(NewPost, self).form_valid(form) 

    def get_success_url(self): 
     # Unchanged ... 

Я вижу в вашем коде, что вы пытаетесь сделать что-то с пользователем, но я не понимаю, почему ваше сообщение не имеет поля пользователя (вы можете добавить a created_by), и UserProject должен уже иметь пользовательский набор.

Я также предполагаю, что пользователь добрался до своего проекта, поэтому вы знаете по определению, что проект, который он добавляет, является его. Если это не так, просто измените логику, чтобы получить UserProject с помощью обычного запроса. например возможно, с `UserProject.objects.get (user = self.request.user), если на пользователя есть один проект (опять же, как пример).

Во всяком случае, я делаю некоторые предположения здесь, но, надеюсь, главный вопрос заключался в том, как установить проект на newPost, и на это отвечает мой пример.