PHP'nin formu dirsek hüner Django'nın ___ nedir?

7 Cevap php

PHP isimleri ile form elemanları gibi oluşturabilirsiniz:

category[1]
category[2]

ya da

category[junk]
category[test]

Form yayınlanmıştır olduğunda, category otomatik gibi güzel bir sözlüğe dönüştü:

category[1] => "the input value", category[2] => "the other input value"

Django yapmak için bir yolu var mı? Sadece bir liste değil, bir sözlük döndürür, çünkü request.POST.getlist, pek doğru değil. Ben de anahtarları lazım.

7 Cevap

Sen django.utils.datastructures.DotExpandedDict with inputs named category.1, category.2 etc. to do something similar, but I don't really see why you would if you ever have to validate and redisplay the information you're receiving, when using a django.forms.Form will do everything for you - appropriate fields will call the getlist sizin için bir yöntem ve prefix argüman aynı formu birden çok kez yeniden kullanılabilir kullanabilirsiniz.

Pek güzel, ama bu işi halletmek gerekir:

import re

def getdict(d, pref):
  r = re.compile(r'^%s\[(.*)\]$' % pref)
  return dict((r.sub(r'\1', k), v) for (k, v) in d.iteritems() if r.match(k))

D = {
  'foo[bar]': '123',
  'foo[baz]': '456',
  'quux': '789',
}

print getdict(D, 'foo')
# Returns: {'bar': '123', 'baz': '456'}

Ben bu sizin için ne arıyorsanız değil almak - Sen request.POST['namefromform'] yapabilirim?

Kullan request.POST.keys()

Üzgünüm, bildiğim kadarıyla saptadığımız gibi, GetList tüm istediğiniz ne için orada olduğunu, ancak kolayca request.POST.keys() kullanarak isteği ayrıştırmak ve sözlükler çevirmek onları gelebilir.

Ben bir piton uzmanı değilim ama deneyebilirsiniz

for key,value in request.POST.iteritems() 
  doSomething....

django.utils.datastrctures DotExpandedDict var

Ben parantez tarafından sözlüğü ayrıştırır bunun çatal, yazdım ..

class BrExpandedDict(dict):
    """
    A special dictionary constructor that takes a dictionary in which the keys
    may contain brackets to specify inner dictionaries. It's confusing, but this
    example should make sense.

    >>> d = BrExpandedDict({'person[1][firstname]': ['Simon'], \
            'person[1][lastname]': ['Willison'], \
            'person[2][firstname]': ['Adrian'], \
            'person[2][lastname]': ['Holovaty']})
    >>> d
    {'person': {'1': {'lastname': ['Willison'], 'firstname': ['Simon']}, '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}}
    >>> d['person']
    {'1': {'lastname': ['Willison'], 'firstname': ['Simon']}, '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}
    >>> d['person']['1']
    {'lastname': ['Willison'], 'firstname': ['Simon']}

    """
    def __init__(self, key_to_list_mapping):
        for k, v in key_to_list_mapping.items():
            current = self
            k = k.replace(']', '')
            bits = k.split('[')
            for bit in bits[:-1]:
                current = current.setdefault(bit, {})
            # Now assign value to current position
            try:
                current[bits[-1]] = v
            except TypeError: # Special-case if current isn't a dict.
                current = {bits[-1]: v}

if __name__ == "__main__":
    import doctest
    doctest.testmod()