繁体   English   中英

如何在数据库中保存数据属性?

[英]How to save data attributes in database?

我正在建立一个网站,我需要在数据库中保存一些HTML变量。 这个想法是保存用户标记的文本的段落,并保存在数据库中以在用户访问页面时显示它(例如在medium.com中 )。

当用户单击段落时,我无法刷新页面,我只需要在数据库中保存单击的段落ID( data-artigo )。

那是我的视图details.html ,我需要将值artigo.pklei.pk保存在数据库中

   <!-- Begin Post Content -->
     <div class="article-post">
       {% for artigo in artigos %}   
         <p class='artigo'  data-artigo = "{{artigo.pk}}" data-lei = "{{lei.pk}}">
            {{artigo}}
         </p>
       {% endfor %}
      </div>
   <!-- End Post Content -->

我有一个js函数,它接收这些值并设置一个黄色背景( .highlight )来标记单击的段落。 所以我必须将这些数据保存在数据库中:

$("p.artigo").on("dblclick",(function(e){
    let artigo = $(this).data('artigo');
    let lei = $(this).data('lei');
    let is_marked;

    if ($(this).hasClass( "highlight" )){
        $(this).removeClass("highlight");
        is_marked = false;
    }else{
        $(this).addClass("highlight");
        is_marked = true;
    }        
}));

这是我需要存储这些数据的表(我的模型):

class Marcacao(models.Model):
    lei = models.ForeignKey(Lei, on_delete=models.CASCADE, verbose_name='Lei', related_name='marcacaoArtigos')
    artigo = models.ForeignKey(Lei, on_delete=models.CASCADE, verbose_name='Artigo', related_name='marcacaoLei')
    usuario = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='marcacaoUsuário', related_name='marcacaoUsuario')

    is_marked = models.BooleanField('Está Marcado?', blank=True, default=False)
    description = models.TextField('Descrição', blank = True, null=True)

如果我没看错,我认为我需要在视图中创建一个函数并将这些数据作为参数传递给该函数,但是我不知道该怎么做。

最好的选择取决于您希望它如何工作。 如果用户单击段落被认为是“提交”,则可以从JS对视图运行Ajax查询,然后将数据回传到模型中。 但是,如果要继续在页面上进行活动,请考虑使用Django Rest Framework并创建API调用,您可以再次向Ajax查询发送数据。 我的建议是DRF,将数据序列化并保存到模型中非常简单。 https://www.django-rest-framework.org/

您在urls.py中注册您的api:

router = routers.DefaultRouter()
api_patterns = [
    router.register(r'selected-paragraph', api.selectedParagraphViewSet)
]
urlpatterns = [
url(r'api/', include(api_patterns)),

然后在您的api.py中:

class selectedParagraphViewSet(viewsets.ModelViewset):
    queryset = Marcacao.objects.all()
    serializer_class = MarcacaoSerializer

    def create(self, request, *args, **kwargs):
        try:
            data = {
                'lei': request.data.pop('lei'),
                'artigo': request.data.pop('artigo'),
                'is_marked': request.data.pop('is_marked'),
                'usuario': request.user
            }
            serializer = self.get_serializer(data=data, method='post')
            serializer.is_valid(raise_exception=True)
            return Response(serializer.data)
        except serializers.ValidationError:
            print(traceback.print_exc())
            raise

然后在您的serializers.py中:

class MarcacaoSerializer(serializers.ModelSerializer):
    def Meta:
        model = Marcacao
        fields = '__ALL__'

最后一个不错的ajax调用将其全部发送出去:

var submitData = {
    'let': lei,
    'artigo': artigo,
    'is_marked': is_marked
}
$.ajax({
    url: '/api/selected-paragraph',
    method: 'PUT',
    data: submitData,
    dataType: 'json',
    crossDomain: true,
    xhrFields: {
        withCredentials: true
     },
     success: function(data, stat, xhr) {
         console.log("Was a success");
     },
     failure: function(xhr, stat, err){
         console.log('POST error');
         console.log((xhr.responseJSON && xhr.responseJSON.msg) ? xhr.responseJSON.msg : '"'+err+'" response when communicating with server.');
      }
});

还要注意的一点是,如果可以在Ajax调用中传递request.user,甚至可以消除api.py中对create函数的需求,但我认为这种方式将更好地展示如何将数据输入数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM