亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django:同一頁面上的帖子表單和帖子列表

Django:同一頁面上的帖子表單和帖子列表

白衣染霜花 2024-01-16 15:13:03
我創建了一個具有多個用戶的網站,使用圖像發布帖子并能夠添加/刪除朋友。因此,很容易為帖子列表創建兩個不同的頁面并創建一個新頁面。但當然,當你可以在同一個地方閱讀帖子并發布新帖子時,它看起來會更好。據我了解(學習 django 不到一個月),我無法將 2 個視圖連接到同一個 url,所以我看到的最合乎邏輯的方法是將 2 個視圖連接到一個視圖中,我還嘗試使用模板繼承來渲染通過包含模板發布表單,但實際上它不起作用。下面你可以看到我的觀點、帖子模型和模板。感謝您的關注。views.py:from braces.views import SelectRelatedMixinfrom . import modelsfrom django.views import genericfrom django.contrib.auth.mixins import LoginRequiredMixinclass PostList(SelectRelatedMixin, generic.ListView):    model = models.Post    select_related = ('user',)class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):    fields = ('post_message', 'post_image')    model = models.Post    select_related = ('user',)    def form_valid(self, form):        self.object = form.save(commit = False)        self.object.user = self.request.user        self.object.save()        return super().form_valid(form)models.py:import misakaclass Post(models.Model):    user = models.ForeignKey(User, on_delete = models.CASCADE, related_name = 'posts')    posted_at = models.DateTimeField(auto_now = True)    post_message = models.TextField()    message_html = models.TextField(editable = False)    post_image = models.ImageField(upload_to = 'postpics', blank = True)    def __str__(self):        return self.post_message    def save(self, *args, **kwargs):        self.message_html = misaka.html(self.post_message)        super().save(*args, **kwargs)    def get_absolute_url(self):        return reverse('posts:all')    class Meta:        ordering = ['-posted_at']        unique_together = ['user', 'post_message']urls.py:app_name = 'posts'urlpatterns = [    path('', views.PostList.as_view(), name = 'all'),    path('new/', views.CreatePost.as_view(), name = 'create'),]post_form.html(模板,允許創建新帖子,將在 post_list.html 中看到):
查看完整描述

3 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

您可以將 post_create_form 與 post_list_view 放在同一頁面上,無需為帖子創建創建單獨的視圖,但您需要創建用于編輯和刪除的視圖。您可以為所有這些視圖提供具有不同 URL 的相同 HTML 頁面。在 Class_Based_Views 中使用template_name = 'example/example.html',。我希望我能理解您的問題,如果不能進一步澄清為什么您不能將兩個視圖合并為一個。



查看完整回答
反對 回復 2024-01-16
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

def posts(request):

posts = Post.objects.all()


form = PostForm(request.POST or None, request.FILES or None)

if request.method == "POST":

    if form.is_valid():

       ...


context={

    'posts'         : page_obj,

    'create_or_update_post_form' : form,


}

return  render(request, 'post/posts.html',context)

您是否在基于類的視圖中很難做到這一點?


查看完整回答
反對 回復 2024-01-16
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

您可以使用基于 django 類的視圖輕松完成。


創建視圖為

from django.views.generic import ListView

from django.views.generic.edit import CreateView


class ModelCreate(CreateView):

    model = ModelName

    fields = ['field1', 'field2']

    template_name = 'same_page.html'

    success_url = reverse_lazy('list_view')



class ModelList(CreateView, ListView):

    model = ModelName

    fields = ['field1', 'field2']

    paginate_by = 5

    template_name = 'same_page.html'


    def get_context_data(self, *args, **kwargs):

        context = super().get_context_data(*args, **kwargs)

        context['form'] = self.get_form()

        return context


    # If form post redirect to ModelCreate View

    def post(self, request, *args, **kwargs):

        return ModelCreate.as_view()(request)

應用程序/urls.py

from django.urls import path

from app import views


path('list', views.ModelList.as_view(), name='list_view'),

path('add', views.ModelCreate.as_view(), name='add_view'),

最后在 templates/same_page.html 中

<div class="row">

   <div class="col-sm-5">

      <form method="post" enctype="multipart/form-data">

         {% csrf_token %}

         {{form.as_p}}

         <button type="submit" value="submit" class="btn btn-primary btn-sm float-right">Submit</button>                              

       </form>

   </div>

   <div class="col-sm-5">

    {% if object_list %}

       {% for object in object_list %}

         <p>{{object.field1}}</p>

         <p>{{object.field2}}</p>

       {% endfor %}

    {% endif %}

   </div>

</div>

希望這可以幫助。


查看完整回答
反對 回復 2024-01-16
  • 3 回答
  • 0 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號