为什么Django管理员在主键中的下划线和十六进制字符有问题?

时间:2019-05-01 23:56:00

标签: django django-admin django-orm

当我单击应用程序管理页面中的某些链接时,出现如下错误:

  

“ ID为“ 12345-2Q2019-SCA â A的对象不存在。也许已删除?”

记录的主键(显示在链接上)实际上是这样的:

  

12345-2Q2019-SCA_ E2 A

任何包含下划线和大写字母A-F的记录都会出现此错误。似乎Django想要将下划线和结尾字母编码为十六进制字符,并且由于数据库中不存在带有十六进制字符的PK,因此Django无法找到记录,也不会重定向到我的对象的更改表格。

我尝试通过覆盖get_admin_url()方法将此PK转换为模型字符串:

<?php
echo '<div class="dbrd"> 
$query = " SELECT id, status, fullname FROM members ";
$result = mysqli_query($db, $query);
$i = 0;
while ($row = mysqli_fetch_assoc($result)) {
    if (bitN($row[status],2) == 1 && $row[id] > 20){
        $featuredArtist[$i]['id'] = $row['id'];
        $featuredArtist[$i]['artist'] = $row['fullname'];
        $i++;
    }
}   

?>                      
<div style="text-align:center;width:100%;">
    <table style="width:100%;">
        <thead>
            <tr><th colspan="3">Featured Artists</th></tr>
        </thead>
        <tbody>
<?php                                   
            $j = 0; 
            while ($j < $i){
                echo " <tr><td>".$featuredArtist[$j]['artist']."</td>";
                $j++;
                echo " <td>".$featuredArtist[$j]['artist']."</td>";
                $j++;
                echo " <td>".$featuredArtist[$j]['artist']."</td></tr>";
                $j++;
            }
?>
        </tbody>
    </table>
        <br />
</div>
<?php
$query = "SELECT id, artist FROM aotm";
$result = mysqli_query($db, $query);
$k = 0;
while ($row = mysqli_fetch_assoc($result)) {
    $aotm[$k]['id'] = $row['id'];
    $aotm[$k]['artist'] = $row['artist'];
    $k++;
}
$l = 0;
echo '<datalist id = "artist">';
    while ($l < $i) {
        $artist = $featuredArtist[$l]['artist'];
        echo " <option value = ".$artist.">";
        $l++;
    }
?>                      
</datalist>

<form action = "" method = "POST">
    <table style="width:100%;">
        <tbody>
            <tr><td>Jan</td><td><input type = "text" list = "artist" name="1" size = "45" ></td></tr>
            <tr><td>Sept</td><td><input list = "artist" type = "text" name="2" value = "<?php echo $aotm[1]['artist'];?>" size = "45" /></td></tr>

            <tr><td colspan="2"><input type = "submit" name = "aotm" value = "Save" /></td></tr>
        </tbody>
    </table>
</form>
</div>

在管理文件中,使用format_html手动创建网址:

# models.py
def get_admin_url(self):
    content_type = ContentType.objects.get_for_model(self.__class__)
    return reverse("admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(self.id,))

仍然,我无法获得带有这些“十六进制”字符的链接以链接到其更改表单页面。

我的数据库,服务器和settings.py文件都严格定义了UTF8编码。

Django是否在某个地方对这些十六进制字符进行编码/解码,或者有什么方法可以让我忽略这些字符?

1 个答案:

答案 0 :(得分:0)

问题不直接是 UnicodeDecodeError!

quote()/unquote()中的django.contrib.admin.views.main.py例程和字符组合"_ad"(有效的十六进制数字)存在问题。

  

实际问题

主键字符串以unquote()开头,但以前没有以quote()开头。

错误可能出在change_stage()中。我不知道为什么不使用quote()

  

解决方法

您需要使用连字符 -或使用下划线 -或使用其他受支持的字符。