404 на CreateView form_valid с более чем 1 аргументом

SamirTendulkar спросил: 28 марта 2018 в 03:03 в: python

Мое доказательство App CreateView принимает 2 аргумента "пользователь" и "сообщение". Требование пользователя выполняется с помощью self.object.user = self.request.user. Как выполнить требование self.object.post. Я новичок в Django. Я прошу прощения, если я нарушаю любые правила Django.

models.py

User = get_user_model() 
class Proof(models.Model):
    user = models.ForeignKey(User, related_name='proofmade')
    post = models.ForeignKey(Post, related_name='proofmade')
    made_at = models.DateTimeField(auto_now=True)
    image_of_task= models.ImageField()
    proof_you_made_it = models.ImageField()
    suggestions = models.TextField(max_length=1000)def __str__(self):
    return self.post.title

views.py

User = get_user_model()
class ProofCreate(LoginRequiredMixin, CreateView):
   model = Proof
   fields = ('image_of_task', 'proof_you_made_it', 'suggestions')   def form_valid(self, form, *args, **kwargs):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        ###### I think the following line may be wrong ##########
        slug = self.kwargs.get('slug')     
        print(slug)
        self.object.post = get_object_or_404(Post, slug=slug)
        self.object.save()
        return super().form_valid(form)

urls.py

app_name = 'proof'urlpatterns = [
    url(r'^new_proof/$', views.ProofCreate.as_view(), name='new_proof'),

1 ответ

Есть решение
Alasdair ответил: 28 марта 2018 в 05:02

Если вы хотите получить доступ к slug из self.kwargs в представлении, вам нужно slug в URL. Например:

url(r'^new_proof/(?P<slug>[-\w]+)/$', views.ProofCreate.as_view(), name='new_proof')

Вам не нужен username, потому что вы получаете пользователя из self.request.user. Во второй попытке post.slug неверно, поскольку имена переменных не могут содержать точек.

В представлении я бы использовал slug = self.kwargs['slug'], если вы не хотите, чтобы это было необязательный. В данный момент get() возвращает None, поэтому вы позже получите ошибку в своем коде.

SamirTendulkar ответил: 28 марта 2018 в 05:05
Я тоже попробовал это. NoReverseMatch в / posts / admin / tieing-a-knot / Reverse для 'new_proof' без аргументов не найден. Попробован 1 шаблон (ов): ['proof / new_proof / (? P < slug > [- \\ w] +) / $'] Метод запроса: GET
SamirTendulkar ответил: 28 марта 2018 в 05:20
с помощью url (r '^ new_proof / $', views.ProofCreate.as_view (), name = 'new_proof'), (старый URL) появляется форма, позволяющая мне добавлять изображения, когда я нажимаю на submit. Я получаю ошибки. Как вы думаете, что-то изменить в form_valid возможно slug = self.kwargs.get ('slug'). Если я добавлю слаг в URL, форма не появится
SamirTendulkar ответил: 28 марта 2018 в 05:08
Как вы думаете, это может быть потому, что когда вы говорите "слизняк", он ищет доказательство слизняков но в моделях доказательств вы можете видеть, что доказательство не имеет атрибута slug. У поста есть слизняк. Также пост & пользователь является внешним ключом Proof
Alasdair ответил: 28 марта 2018 в 05:21
Нет, я уже объяснил, почему вы не должны использовать self.kwargs.get('slug'). Ошибка NoReverseMatch at /posts/admin/tieing-a-knot/ - это другая проблема, возникающая в другом представлении / шаблоне.
SamirTendulkar ответил: 28 марта 2018 в 05:49
Можете ли вы посоветовать, что я могу использовать вместо self.kwargs.get ('slug'). Я не могу понять это. Я пытался играть с "related_name, чтобы как-то заставить его работать