Я учусь Django, как изменить функцию на класс в views.py - PullRequest
0 голосов
/ 21 октября 2019

Как изменить функцию на класс в views.py

Я хочу изменить представление на что-то вроде этого:

https://docs.djangoproject.com/en/dev/ref/class-based-views/generic-editing/#createview

class NewTopic(CreateView):
    model = Topic
    fields = ['title', 'category', 'author', 'text']
    template_name = 'app_a/new_category.html'

Этоне правильно, я хочу изменить его.

models.py

class Category(models.Model):
    title = models.CharField(max_length=200, default='')
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateTimeField(default=localtime)

    def __str__(self):
        return self.title


class Topic(models.Model):
    title = models.CharField(max_length=200, default='')
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField(default='')
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

views.py

def new_topic(request, pk):
    category = Category.objects.get(pk=pk)
    if request.method == 'POST':
        form = TopicForm(data=request.POST)
        if form.is_valid():
            new_topic = form.save(commit=False)
            new_topic.author = request.user
            new_topic.category = category
            new_topic.save()
            form.save_m2m()
            return HttpResponseRedirect(reverse('app:category', args=[pk]))
    else:
        return render(request, 'app/index.html')

    context = {'category': category, 'form': form}
    return render(request, 'app/new_topic.html', context)

forms.py

class CategoryForm(forms.ModelForm):
    class Meta:
        model = Category
        fields = ['title', 'author']


class TopicForm(forms.ModelForm):
    text = forms.CharField(widget=forms.Textarea(attrs={"rows":5,'cols': 50}))
    class Meta:
        model = Topic
        fields = ['title', 'category', 'author', 'text']

urls.py

urlpatterns = [
    re_path(r'^new_topic/(?P<pk>\d+)/$', views.new_topic, name='new_topic'),
]

Я не знаю, как его изменить, спасибо!

1 Ответ

1 голос
/ 21 октября 2019

Поскольку у вас уже есть формы, попробуйте выполнить следующее:

class NewTopic(CreateView):
    model = Topic
    form_class = TopicForm
    template_name = 'app_a/new_category.html'

Кроме того, в вашем urls,py вам необходимо указать новое представление на основе классов.

urlpatterns = [
    re_path(r'^new_topic/(?P<pk>\d+)/$', views.NewTopic.as_view(), name='new_topic'),
]

Вы можете переопределить метод form_valid, чтобы добавить свою собственную логику.

def form_valid(self, form):
    # your logic
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...