在 django 中使用 Boostrap 自动完成模型形式的外键字段

问题描述

我对 Django 比较陌生。我已经按照他们的教程尝试使用 django-autocomplete-light 几个小时,但我无法使其工作(基本上我什至无法从表单中搜索任何内容)。在那之后,我找到了这个线程,我决定试一试,因为它很简单,而且不需要安装任何应用程序,这似乎更可取 how to create a autocomplete input field in a form using Django

我的最终目标非常简单,为了能够开始对话,用户需要选择它属于哪个圈子。为此,我们允许用户在创建对话时通过开始输入来找到现有的“圈子”。完成所有步骤后,我可以在表单字段中输入单词,但实际上什么也没发生。我也尝试转到 URL 'circle_autocomplete' 但它说 视图conversation.views.circle_autocomplete 没有返回HttpResponse 对象。它返回 None 。 谁能告诉我下一步?

我也尝试过更改表单类型,但没有任何作用。 非常感谢。

models.py

class Circle(models.Model): 
    circle = models.CharField(max_length=60,null=True,blank=False,unique=True)
    description = models.CharField(max_length=200,unique=False)
    slug = models.SlugField(max_length=80,blank=True)
    is_active = models.BooleanField(default=True)
    created_date = models.DateTimeField(blank=True,auto_Now_add=True)
    starter = models.ForeignKey(
        'users.CustomUser',verbose_name='user',on_delete=models.SET_DEFAULT,default=1,related_name='Circle_Starter_User',)
    
    def __str__(self):
        return self.circle

class Conversation(models.Model):
    conversation = models.CharField(max_length=60,unique=False)
    detail = models.CharField(max_length=600,unique=False)
    circle = models.ForeignKey(  #circle - this is the higher level
        Circle,on_delete=models.CASCADE,related_name='Parent_Circle',)
    starter = models.ForeignKey(
        'users.CustomUser',related_name='Conversation_Starter_User',)
    conversation_type = models.CharField(choices=CONVERSATION_TYPE,null=False,max_length=140)
...

views.py

class StartConversationView(LoginrequiredMixin,View):
    def get(self,request,*args,**kwargs):
        form = StartConversationForm()
        return render(request,'conversations/start.html',{'form': form})
    def post(self,**kwargs):
        form = StartConversationForm(request.POST)
        if form.is_valid():
            new_conversation = form.save(commit=False)            
            new_conversation.starter = request.user            
            new_conversation.save()
            messages.success(request,('You have successfully started a new conversation.'))       
            return redirect(reverse('conversation_detail',kwargs={'slug':new_conversation.slug}))
        return render(request,'conversation_detail',{'form': form})

def circle_autocomplete(request):
    if request.GET.get('q'):
        q = request.GET['q']
        data = model.objects.using('legacy').filter(circle__startswith=q).values_list('circle',flat=True)
        json = list(data)
        return JsonResponse(json,safe=False)
    else:
        HttpResponse("No cookies")

urls.py

from .views import StartCircleView,StartConversationView,ConversationDetailView,CircleDetailView,CircleAutocompleteView,circle_autocomplete
from . import views
urlpatterns = [
    path('start_conversation/',StartConversationView.as_view(),name='start_conversation'),path('circle_autocomplete/',views.circle_autocomplete,name='circle_autocomplete'),

forms.py

class StartConversationForm(forms.ModelForm):
    circle = forms.CharField(required=True,widget=forms.TextInput(
        attrs={
            'style': 'width: 400px','class': 'basicAutoComplete','data-url': "/domain/circle_autocomplete/"
        }))
    class Meta:
        model = Conversation 
        fields = ('conversation','detail','circle','conversation_type','contributor_access','verification_requirements','visibility','duration_unit','duration')

模板

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %}Home{% endblock title %}
{% load static %}


{% block script %}
    <script src="https://cdn.rawgit.com/xcash/bootstrap-autocomplete/3de7ad37/dist/latest/bootstrap-autocomplete.js"></script>
    <script>
        $('.basicAutoComplete').autoComplete(
            {minLength: 1}
        );
        $('.dropdown-menu').css({'top': 'auto','left': 'auto'})

    </script>
{% endblock %}



{% block content %}
{% if user.is_authenticated %}
  <h2>Start A Conversation</h2>

   <form method="POST" class="padding">
      {% csrf_token %}
      {{form|crispy}}
      
      <button class="btn btn-success" type="submit">Start Conversation</button>
    </form> 

    {% else %}
    <p>You are not logged in</p>
    <a href="{% url 'login' %}">Log In</a> |
    <a href="{% url 'signup' %}">Sign Up</a>
  {% endif %}
  {% endblock content %}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)