首页 > 解决方案 > 如何从 django 中的模型对象中获取数据

问题描述

我正在使用 Tweepy 发布来自 Django 管理员的推文。如图所示,如何从模型对象中检索“标题”和“图像”,每当我单击推文按钮时,它应该在我的 Twitter 帐户上发布一条推文,标题为文本和图像。

示例:假设我有 4 个模型对象,每个对象都有一个标题和一个图像,我只想获取我想在 Twitter 上发布的那个对象的标题和图像。

我可以做的一件事是传递该特定模型对象的主键或 id,但我不知道如何在下面的模板中传递它。

Django 管理表单页面

#template

{% extends 'admin/change_form.html' %}
{% load i18n %}
{% block content %}
    {{ block.super }}
    <form action="{% url 'post_tweet' %}" method="POST">
        {% csrf_token %}
        <input type="submit" value="Tweet" name="add_tweet">
    </form>
{% endblock %}
   
#urls.py

urlpatterns = [
    path('', views.Home.as_view(), name="home"),

    path('$', views.tweet, name="post_tweet"),
    
]
#models.py

class Movie(models.Model):
    GENRE = (
        ('Action', 'Action'),('Adventure', 'Adventure'),('Comedy', 'Comedy'),
        ('Crime', 'Crime'),('Drama', 'Drama'),('Fantasy', 'Fantasy'),
        ('Horror', 'Horror'),('Mystery', 'Mystery'),('Science Fiction', 'Science Fiction'),
        ('Superhero', 'Superhero'),('Thriller', 'Thriller'),('War','War'),('Others','Others')
    )

    image = models.ImageField(upload_to="images/",blank=True, default="default-image.png",null=True)
    title = models.CharField(max_length=50, unique=True)
    slug = models.SlugField(max_length=100, allow_unicode=True, unique=True, default='',blank=True)
    genre = models.CharField(max_length=30, choices=GENRE)
    description = models.TextField(max_length=500, blank=True)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args,**kwargs)
    
    class Meta:
        ordering = ["-title"]

# views.py 

def tweet(request):

    if request.method == "POST":
        twitter_auth_keys = {
            "consumer_key"        : "XXX",
            "consumer_secret"     : "XXX",
            "access_token"        : "XXX",
            "access_token_secret" : "XXX"
        }

        auth = tweepy.OAuthHandler(
                twitter_auth_keys['consumer_key'],
                twitter_auth_keys['consumer_secret']
                )
        auth.set_access_token(
                twitter_auth_keys['access_token'],
                twitter_auth_keys['access_token_secret']
                )
        api = tweepy.API(auth)
        
        `Do something here`

        tweet = "New"
        post_result = api.update_status(status=tweet)
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

标签: djangodjango-viewsdjango-admindjango-queryset

解决方案


您可以在模板中打印object_id值,该值默认由change_view方法传递,如果您也想将额外数据传递给 change_view 模板,则始终可以覆盖此方法:https ://docs.djangoproject.com/ en/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.change_view

所以一种做你想做的事情的方法是,你可以在隐藏的输入中打印 object_id,这样该值将通过表单提交传递给你的视图:

{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block content %}
    {{ block.super }}
    <form action="{% url 'post_tweet' %}" method="POST">
        {% csrf_token %}
        <input type="hidden" name="movie_id" value="{{ object_id }}">
        <input type="submit" value="Tweet" name="add_tweet">
    </form>
{% endblock %}

现在,您可以通过搜索其 id 来获取该对象的实例并在您的推文视图中获取电影的标题和图像。


推荐阅读