【问题标题】:Using same models for different webpages对不同的网页使用相同的模型
【发布时间】:2018-12-01 00:25:35
【问题描述】:

所以我有一个主题。

class Topic(models.Model):
    topic_choices = (
                    ('t_topic', 't_topic',),
                    ('f_topic', 'f_topic',)
    )
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE) 
    type = models.CharField(max_length=100, choices=topic_choices)

    def __str__(self):
        return self.text 

根据创建日期检索和显示主题。

def topics(request):
    """Show all topics """
    topics = Topic.objects.order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)

我想做的是根据创建主题的网页以某种方式区分主题。

然后我希望在同一个网页上显示相同的主题。

正如您在下面看到的那样。由于使用了相同的 topic_id,因此 topic.html 和 f_topic.html 上显示了相同的主题。

我想拥有它,如果主题是在 topic.html 上创建的,那么它会显示在 topic.html 上。如果它是在 f_topic.html 上创建的,那么它会显示在 f_topic.html 上。

def topic(request, topic_id, type):
    topic = Topic.objects.get(id=topic_id, type='t_topic')
    entries = topic.entry_set.order_by('-date_added')
    images = Image.objects.filter(imgtopic__in=entries)
    context = {'topic': topic, 'entries': entries, 'images': images}
    return render(request, 'learning_logs/topic.html', context)

def f_topic(request, topic_id):
    topic = Topic.objects.get(id = topic_id)
    entries = topic.entry_set.order_by('-date_added')
    images = Image.objects.filter(imgtopic__in = entries)
    context = {'topic': topic, 'entries': entries, 'images': images}
    return render(request, 'learning_logs/f_topic.html', context)

主题如何保存为 t_type

def new_topic(request):

    if request.method != 'POST':
    #No data submitted; create a blank form.
    form = TopicForm()

        if form.is_valid():
            new_topic = form.save(commit = False)
            new_topic.type = 't_topic'
            new_topic.owner = request.user 
            new_topic.save() 
            form.save()
            return HttpResponseRedirect(reverse('learning_logs:topics'))
    else:
        form = TopicForm(request.POST)

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

主题.html

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

 {% block content %}
    <div class = 'topic-heading'>
     <p>TOPIC : {{topic}}</p>
    </div>

    <div class = 'topic-container'> 
     {%include 'learning_logs/text.html'%}
    </div>

我在 /topics/ 处收到相同的 NoReverseMatch 错误 未找到带有参数“(10,”)的“主题”的反向。尝试了 1 种模式:['topics/(?P[0-9]+)/(?P[^/]+)/$']

这里是应该显示主题的topics.html。

{% extends "learning_logs/base.html" %}

{% block content %}

<div class = 'topics-1'>
    <h1> Topics: </h1>

    <ul>
    {% for topic in topics %}
        <li>
         <a href = "{% url 'learning_logs:topic' topic.id topic.type%}">[] {{topic}}</a>
        </li>

        {% empty %}

        <li> No topics have been added yet. </li>

        {% endfor %}
    </ul>
</div>

<a href = "{% url 'learning_logs:new_topic' %}"> Add a new topic :</a>

{% endblock 内容 %}

【问题讨论】:

  • 你现在遇到了什么问题?您还应该发布主题页面的 html。
  • 相同的错误 NoReverseMatch 在 /topics/ Reverse for 'topic' 没有找到参数 '(10, '')'。尝试了 1 种模式:['topics/(?P[0-9]+)/(?P[^/]+)/$']
  • 该错误何时显示?当您尝试访问 topic.html 时?当您转到显示错误的页面时,您单击的链接是什么?你确定有问题的对象有一个保存在数据库中的类型吗?
  • 当我只想显示主题时发生错误。因此,如果我创建一个主题,它应该列在一个名为 topic.html 的模板中。然后如果单击特定主题,则应打开一个名为 topic.html 的新模板,其内容应显示在那里。我不确定如何检查数据库,我假设是通过 shell 对吗?
  • 所以它存储在数据库中 .. print(topic.id, topic, topic.type) ... 1 John Connor t_topic 9 简单 t_topic 10 新的一个 11 john 12 kkkkk 13 oiojoijioj 14 ppppppp 15 pppoko t_topic 16 plplplplp t_topic 17 okokook t_topic 18 gucci t_topic 19 pkpkpkppk t_topic 20 okokokokokokpopoppopo t_topic 21 kokokokok t_topic 22 okkoko t_topic

标签: python django forms model


【解决方案1】:

要实现这一点,请将模板的名称添加到上下文中。

context = {'topic': topic, 'entries': entries, 'images': images, 'template':example.html}

然后在模型主题中,添加一个字段:

template = models.CharField(max_length = 200).

在保存新建主题的视图中,获取模板的请求值:

topic.template = request.POST.get("template")

【讨论】:

    【解决方案2】:

    您可以向您的主题模型添加一个类型,即:

    class Topic(models.Model):
    topic_choices= (
                    ('t_topic', 't_topic',)
                    ('f_topic', 'f_topic',)
    )
    text = models.CharField(max_length = 200)
    date_added = models.DateTimeField(auto_now_add = True)
    owner = models.ForeignKey(User, on_delete = models.CASCADE) 
    type = models.CharField(max_length=100, choices=topic_choices)
    
    def __str__(self):
    
        return self.text
    

    然后当您检索主题时指定类型:

    def f_topic(request, topic_id, type):
        topic = Topic.objects.get(id=topic_id, type='f_topic')
    

    您必须更改您的网址,但您可以将其添加到链接中:

    <a href = "{% url 'learning_logs:topic' topic.id topic.type %}">
    

    【讨论】:

    • 如何将类型传递给 f_topic 函数?
    • topic.id 通过另一个模板传递给 f_topic 函数。如[] {{topic}}。现在我收到错误说缺少类型位置参数。
    • @h.pylori - 忘了告诉你我更新了我的答案。也许会有所帮助。
    • 还是不行。我需要在 urls.py 中添加任何内容吗?这就是它的样子 [path('topics//', views.topic, name = 'topic'),]
    • @h.pylori - 是的,你必须添加类型 [path('topics///', views.topic, name = 'topic'),]了解您遇到了什么错误或哪里出了问题会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多