Py学习  »  问与答

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

HelloSam • 9 年前 • 10486 次点击  

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

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
 
10486 次点击  
文章 [ 21 ]  |  最新文章 8 年前
bigheartyao
Reply   •   1 楼
bigheartyao    8 年前

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

HelloSam
Reply   •   2 楼
HelloSam    8 年前

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

MCC
Reply   •   3 楼
MCC    9 年前

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

MCC
Reply   •   4 楼
MCC    9 年前

@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    9 年前

@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    9 年前

@MCC 太感谢你了~~~

MCC
Reply   •   7 楼
MCC    9 年前

上面那个例子的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    9 年前

@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    9 年前

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

HelloSam
Reply   •   10 楼
HelloSam    9 年前

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

MCC
Reply   •   11 楼
MCC    9 年前

@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    9 年前

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

MCC
Reply   •   13 楼
MCC    9 年前

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

HelloSam
Reply   •   14 楼
HelloSam    9 年前

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

MCC
Reply   •   15 楼
MCC    9 年前

@HelloSam

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

不知道是不是你想要的

HelloSam
Reply   •   16 楼
HelloSam    9 年前

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

cdxfish
Reply   •   17 楼
cdxfish    9 年前

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

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

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

MCC
Reply   •   18 楼
MCC    9 年前

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

HelloSam
Reply   •   19 楼
HelloSam    9 年前

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

HelloSam
Reply   •   20 楼
HelloSam    9 年前

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

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

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