社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  问与答

怎么用foreignkey 实现Django下拉选择框

HelloSam • 8 年前 • 9725 次点击  

我想实现:用户点击“学院”下拉框,选择学院,点击“保存”按钮,就可以保存到数据库中。 以下是要保存的模型:

class RepairReport(models.Model):
    college = models.ForeignKey(College)

一下是供用户选择 学院 的模型:

class College(models.Model):
    collegename = models.CharField(verbose_name = '学院名称', blank = True, max_length = 255)
    def __unicode__(self):
        return self.collegename

这个模型里面包含着很多学院的名字。

请问在Form、Templates中,要怎么实现这个 下拉选择框 ?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/1225
 
9725 次点击  
文章 [ 21 ]  |  最新文章 7 年前
bigheartyao
Reply   •   1 楼
bigheartyao    7 年前

@HelloSam 你这个是怎么在mysql同步数据库的?

HelloSam
Reply   •   2 楼
HelloSam    8 年前

@MCC 你好,请问可以帮我解决一下这个问题嘛?http://www.django-china.cn/topic/1500/

MCC
Reply   •   3 楼
MCC    8 年前

话说user为啥不直接保存request.user 要用user.username? 万一用户去改username了,这个表连接关系就那啥了。。

MCC
Reply   •   4 楼
MCC    8 年前

@HelloSam 我自己很少用View,所以照着文档改的,没调试过。。。

from django.shortcuts import render
from django.views.generic import View


def addReport(View):
    form_class = EnteringForm()
    template_name = 'report_template.html'

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            report_tuple = ReportModel(
                user=request.user.username,
                school=form_context.cleaned_data['school'],
                grade=form_context.cleaned_data['grade'],
                home_location=form_context.cleaned_data['home_location'],
            )
            report_tuple.save()
            form = EnteringForm()
        else:
            return HttpResponse(form_context['user'].errors)
        return render(request, self.template_name, {'form': form})
HelloSam
Reply   •   5 楼
HelloSam    8 年前

@MCC 我因为不会把视图函数改写成类的形式,所以要写很多重复的代码(包括前端代码)。所以我想请教你,怎样把一个视图函数改写成 基于类的视图? 比如下面这个函数,该怎么改写成class的形式,在url里as_view就能调用?:

def  addReport(request):
form_context = EnteringForm()
if request.method == 'POST':
    form_context= EnteringForm( request.POST )
    # 这里是增添数据部分
    if form_context.is_valid():
        report_tuple = ReportModel(
            user= request.user.username,
            school= form_context .cleaned_data['school'],
            grade= form_context .cleaned_data['grade'],
            home_location= form_context .cleaned_data['home_location'],
        )
        report_tuple .save()
        form_context= EnteringForm()
    else:
        return HttpResponse(form_context ['user'].errors)
return render_to_response('report_template.html', RequestContext(request,
                                                           locals(),
                                                           )
                          )
HelloSam
Reply   •   6 楼
HelloSam    8 年前

@MCC 太感谢你了~~~

MCC
Reply   •   7 楼
MCC    8 年前

上面那个例子的form声明,本来就没有user

class AccountItemForm(forms.Form):
    item_type_choice = ((1, "支出"), (0, "收入"),)
    datetime = forms.DateTimeField(label="帐目日期")
    detail = forms.CharField(widget=forms.Textarea, label="帐目明细", max_length=65535)
    money = forms.DecimalField(label="单位金额", min_value=0.01, max_digits=10, decimal_places=2)
    quantity = forms.IntegerField(label="数量", min_value=1)
    account_type = forms.ChoiceField(label="帐目类型", required=True, widget=forms.Select, choices=(),)
    item_type = forms.ChoiceField(
        label="帐目操作",
        required=True,
        widget=forms.RadioSelect(renderer=RadioCustomRenderer),
        choices=item_type_choice,
        initial='1')

    def set_item_type_choices(self, request):
       //blablabla
MCC
Reply   •   8 楼
MCC    8 年前

@HelloSam 我处理的类似的还真的是在save里面操作的,本身写form里面就没有写user字段,因为user信息本来就是包含在request里面的,就是取出来的时候再判断用户是否合法是不是登录什么的,比如说像这样的

def account_create(request):
    next_path = '/accountbook'
    if not request.user.is_authenticated():// 提前判断用户是否合法
        return message_page(request, '访问错误', '未登录,不能新建帐目。', nextpath=next_path)
    items = Account_item.objects.filter(
        user=request.user).values('detail').distinct()
    if request.method == 'POST':
        item_form = AccountItemForm(request.POST)
        item_form.set_item_type_choices(request)
        if item_form.is_valid():
            account_type_id = int(item_form.cleaned_data['account_type'])
            account_type = None
            item_type = item_form.cleaned_data['item_type']
            money = Decimal(item_form.cleaned_data['money'])
            if int(item_type) is 1:
                money = -money
            if not account_type_id is 0:
                try:
                    account_type = Account_type.objects.get(id=account_type_id)
                    # if not account_type.owner and not account_type.owner is request.user:
                    #    account_type = None
                except Account_type.DoesNotExist:
                    account_type = None
            new_item = Account_item(
                user=request.user, //看这里,save的时候直接赋值进去了
                detail=item_form.cleaned_data['detail'],
                datetime=item_form.cleaned_data['datetime'],
                money=money,
                quantity=item_form.cleaned_data['quantity'],
                account_type=account_type)
            new_item.save()
            return HttpResponseRedirect(next_path)
HelloSam
Reply   •   9 楼
HelloSam    8 年前

@HelloSam 我觉得不应该是重修save方法。因为save方法一般是在判断is_valid后执行的。如果name一开始没有复制,那么连is_valid的判断也过不了,更别说save。我觉得可能是在判断is_valid之前就赋好值,但是我不知道怎么赋值

HelloSam
Reply   •   10 楼
HelloSam    8 年前

@MCC 我想请教一个问题:假设我有一个form,它的属性有name, school, grade(三个都是必填项)。我只想让用户输入school, grade,而name在后台自动赋值为现用户的用户名(即request.user.username)。我该在哪里、怎样赋值?

MCC
Reply   •   11 楼
MCC    8 年前

@HelloSam

def is_valid(self):
    """
    Returns True if the form has no errors. Otherwise, False. If errors are
    being ignored, returns False.
    """
    return self.is_bound and not self.errors
HelloSam
Reply   •   12 楼
HelloSam    8 年前

@MCC 用init成功给表单赋了值,但是django一直说我的表单is not valid。我用shell查看了 这个表单类,发现 只有8 个属性。然后我init里面给这8个属性都赋值了,但是却not valid。请问form is not valid除了 表单没有填写 这种情况外,还会有什么情况吗?

MCC
Reply   •   13 楼
MCC    8 年前

@HelloSam 可以试一试行不行得通,担心的话看文档。有个肯定不出错的法子是手动从request里面把要的值拿出来,init到form里面去

HelloSam
Reply   •   14 楼
HelloSam    8 年前

@MCC 但我现在这个表单有点复杂。这个表单有两个属性 是由用户输入的;其他属性是直接由 某个模型实例 的属性赋值。所以我必须使用type_form =AccountTypeForm( request.POST ),这样的话还能继续加“initial =……”吗?

MCC
Reply   •   15 楼
MCC    8 年前

@HelloSam

            type_form = AccountTypeForm(
                initial={
                    'title': account_type.title,
                    'detail': account_type.detail,
                }
            )

不知道是不是你想要的

HelloSam
Reply   •   16 楼
HelloSam    8 年前

@MCC 请问怎么把一个 模型的某些属性的值 直接赋给 一个表单的某些属性?我试着直接用“=”号,不行

cdxfish
Reply   •   17 楼
cdxfish    8 年前

这个就是最简单的modelform的一个例子。 如果不用modelform 你就自己纯html + sql结构手动构造吧,比如 MCC 给你的例子。 我给你个modelform的例子。

class YourModelForm(forms.ModelForm): members = UserModelMultipleChoiceField(queryset=User.objects.all(), label=u"成员列表")

ModelForm 的用法,自己看说明,不鼓励做伸手党 。

MCC
Reply   •   18 楼
MCC    8 年前

@HelloSam 我听着觉着未必要用django的template,用js(jquary,...)之类好处理些。。

HelloSam
Reply   •   19 楼
HelloSam    8 年前

@MCC 这是一个新的问题~希望你能帮我解答哦~~~谢谢

HelloSam
Reply   •   20 楼
HelloSam    8 年前

@MCC 我现在有这么一张表:第一列和第二列分别是 a属性和b属性,这两个属性是从 数据库 表1中 读取出来的。第三列为 c属性,是需要用户填写内容的一个 表单。功能:用户填写c属性的 表单内容,点击“提交”按钮后,这三个属性的 信息 会存入 数据库的表2。

现在我的 问题是:这张表有很多行,那我应该怎么判断:用户填写哪一行的 表单,我就把哪一行 从表1读取出来的a属性、b属性 存入到表2中? 这需要一个 表1的 id,那么这个id怎么获取?

网上有人说用HiddenInput来实现,请问这个应该怎么实现?