我正在建立一个网站,我需要在数据库中保存一些HTML变量。这个想法是保存用户标记的文本段落,并保存在数据库中以在用户访问页面时显示它(例如在 medium.com 中)。
当用户单击段落时,我无法刷新页面,我只需要在数据库中保存单击的段落ID(data-artigo
)。
这是我的观点details.html
,我需要在数据库中保存值artigo.pk
和lei.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)
如果我没记错,我认为我需要在视图中创建一个函数并将这些数据作为参数传递给该函数,但是我不知道该怎么做。
答案 0 :(得分:0)
您的最佳选择取决于您希望它如何工作。 如果用户单击段落被认为是“提交”,则可以从JS对视图运行Ajax查询,然后将数据回传到模型中。 但是,如果要继续在页面上进行活动,请考虑使用Django Rest Framework并创建API调用,您可以再次向Ajax查询发送数据。 我的建议是DRF,将数据序列化并保存到模型中非常简单。 https://www.django-rest-framework.org/
您将api注册到urls.py:
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函数的需要,但我认为这种方式将更好地展示如何将数据输入到数据库。